LINUX.ORG.RU

История изменений

Исправление dvetutnev, (текущая версия) :

ТС, твоя основная проблема в кривом дизайне. Твой CQueue и принимает данные, и упорядочивает, и обрабатывает (тем, что ты пытаешься передать как указатель на метод класса), и многопоточку синхронизирует. Не надо так. Ты пытаешься в одном классе сделать все и сразу, а в итоге твой же говнокод (давайте смотреть правде в глаза) тебе по башке и стучит.

Вспомни древний принцип:

Разделяй и властвуй

Должна быть отдельно очередь с прикрученными мьютексом и conditional_variable для синхронизации многопоточки, отдельно обработчики. И жизнь станет проще.

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

Исходная версия dvetutnev, :

ТС, твоя основная проблема в кривом дизайне. Твой CQueue и принимает данные, и упорядочивает, и обрабатывает (тем, что ты пытаешься передать как указатель на метод класса), и многопоточку синхронизирует. Не надо так. Ты пытаешься в одном классе сделать все и сразу, а в итоге твой же говнокод (давайте смотреть правде в глаза) тебе по башке и стучит.

Вспомни древний принцип:

Разделяй и властвуй

Должна быть отдельно очередь с прикрученными мьютексом и conditional_variable для синхронизации многопоточки, отдельно обработчики. И жизнь станет проще.

Подсказка про остановку: ее стоит реализовать как передачу пустого сообщения-терминатора в очередь вместо опроса отдельного флажка. Когда приемник получит сообщение-терминатор это и будет является сигналом, что в очередь никто больше не пишет (и ее можно удалить). Это пустое сообщение-терминатор можно смоделировать обернув свой класс сообщения в std::unique_ptr/std::optional. Вариант с опросом флажка тоже имеет право на жизнь, но но нужно рассматривать это как частный случай (не хотим обрабатывать оставшийся хвост очереди).