История изменений
Исправление dvetutnev, (текущая версия) :
ТС, твоя основная проблема в кривом дизайне. Твой CQueue
и принимает данные, и упорядочивает, и обрабатывает (тем, что ты пытаешься передать как указатель на метод класса), и многопоточку синхронизирует. Не надо так. Ты пытаешься в одном классе сделать все и сразу, а в итоге твой же говнокод (давайте смотреть правде в глаза) тебе по башке и стучит.
Вспомни древний принцип:
Разделяй и властвуй
Должна быть отдельно очередь с прикрученными мьютексом и conditional_variable для синхронизации многопоточки, отдельно обработчики. И жизнь станет проще.
Подсказка про остановку: ее стоит реализовать как передачу пустого сообщения-терминатора в очередь вместо опроса отдельного флажка. Когда приемник получит сообщение-терминатор это и будет является сигналом, что в очередь никто больше не пишет (и ее можно удалить). Это пустое сообщение-терминатор можно смоделировать обернув свой класс сообщения в std::unique_ptr
/std::optional
. Вариант с опросом флажка тоже имеет право на жизнь, но но нужно рассматривать это как частный случай (не хотим обрабатывать оставшийся хвост очереди, хотим быстро завершить процесс).
Исходная версия dvetutnev, :
ТС, твоя основная проблема в кривом дизайне. Твой CQueue
и принимает данные, и упорядочивает, и обрабатывает (тем, что ты пытаешься передать как указатель на метод класса), и многопоточку синхронизирует. Не надо так. Ты пытаешься в одном классе сделать все и сразу, а в итоге твой же говнокод (давайте смотреть правде в глаза) тебе по башке и стучит.
Вспомни древний принцип:
Разделяй и властвуй
Должна быть отдельно очередь с прикрученными мьютексом и conditional_variable для синхронизации многопоточки, отдельно обработчики. И жизнь станет проще.
Подсказка про остановку: ее стоит реализовать как передачу пустого сообщения-терминатора в очередь вместо опроса отдельного флажка. Когда приемник получит сообщение-терминатор это и будет является сигналом, что в очередь никто больше не пишет (и ее можно удалить). Это пустое сообщение-терминатор можно смоделировать обернув свой класс сообщения в std::unique_ptr
/std::optional
. Вариант с опросом флажка тоже имеет право на жизнь, но но нужно рассматривать это как частный случай (не хотим обрабатывать оставшийся хвост очереди).