C++ Блокировка обработки потоков в очереди

Я написал простой класс, который планирую расширить как часть приложения для программирования клиентских сокетов. Класс включает 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;
    }
};

person PentiumPro200    schedule 13.12.2019    source источник
comment
Вы создаете std::thread threadObj1 как локальную переменную в конструкторе Wrapper::Wrapper(). Он уничтожается, как только конструктор покидает его. Это должно (ИМХО) быть переменной-членом Wrapper вместо этого.   -  person Scheff's Cat    schedule 13.12.2019
comment
@Scheff, спасибо, это исправило. Я внес поправку в код выше. Я закрою этот вопрос.   -  person PentiumPro200    schedule 13.12.2019


Ответы (1)


Ответ @Scheff в разделе комментариев правильный. Я исправил код выше. Теперь это работает. Не могу закрыть вопрос еще 2 дня. Модераторы, вы можете закрыть этот вопрос.

person PentiumPro200    schedule 13.12.2019