Я написал простой класс, который планирую расширить как часть приложения для программирования клиентских сокетов. Класс включает BlockingQueue (я скопировал код отсюда: C++, эквивалентный BlockingQueue в Java ). Как только я создаю экземпляр класса Wrapper ниже, я хотел, чтобы он порождал отдельный поток, который просто выполняет функцию print(), которая блокируется в BlockingQueue до тех пор, пока не будет доступна одна или несколько строк, а затем он просто печатает строку в консольное окно. В моем предполагаемом приложении печать консоли будет заменена более трудоемкой сетевой функцией, которая включает в себя отправку пакетов, ожидание подтверждения от получателя и некоторую обработку ошибок. Но пока я просто пытаюсь заставить его печатать в окно консоли без сбоев. Когда я выполняю, он сразу же падает, прежде чем что-либо напечатать.
#include <iostream>
#include <thread>
#include "BlockingQueue.h"
using namespace std;
class Wrapper {
public:
Wrapper() {
threadObj1 = thread(&Wrapper::printer, this);
}
void submitStringToWrite(string str) {
queue.push(str);
}
void printer() {
while(true) {
string str = queue.pop();
cout << str.c_str() << endl;
}
}
private:
BlockingQueue<string> queue;
std::thread threadObj1;
};
int main() {
Wrapper *w = new Wrapper();
w->submitStringToWrite("One");
w->submitStringToWrite("Two");
w->submitStringToWrite("Three");
system("pause");
return 0;
}
Вот реализация очереди блокировки, заимствованная из ссылки выше:
#include <mutex>
#include <condition_variable>
#include <deque>
template <typename T>
class BlockingQueue
{
private:
std::mutex d_mutex;
std::condition_variable d_condition;
std::deque<T> d_queue;
public:
void push(T const& value) {
{
std::unique_lock<std::mutex> lock(this->d_mutex);
d_queue.push_front(value);
}
this->d_condition.notify_one();
}
T pop() {
std::unique_lock<std::mutex> lock(this->d_mutex);
this->d_condition.wait(lock, [=]{ return !this->d_queue.empty(); });
T rc(std::move(this->d_queue.back()));
this->d_queue.pop_back();
return rc;
}
};
std::thread threadObj1
как локальную переменную в конструктореWrapper::Wrapper()
. Он уничтожается, как только конструктор покидает его. Это должно (ИМХО) быть переменной-членомWrapper
вместо этого. - person Scheff's Cat   schedule 13.12.2019