У меня есть класс logger с tbb :: concurrent_queue в качестве поля члена.Потоки, использующие объект logger, вызывают метод для отправки сообщения в эту внутреннюю очередь.Регистратор имеет внутренний поток, который потребляет эти сообщения, пока не получит сторожевое сообщение, а затем этот внутренний поток не завершится.Дело в том, что, если клиенты этого объекта logger пытаются зарегистрировать больше сообщений в этот регистратор (после того, как вызов shutdown отправил стражу), сообщения передаются в очередь, но никогда не принимаются на другом конце и незаметно теряются.В идеале я хотел бы уведомить, когда это так, но использование флага, установленного внутренним потребительским потоком при выходе, чтобы проверять каждый раз, когда я собираюсь отправить новое сообщение в очередь, добавило бы стоимость перехода к тому, что является для меня критическим путем.
Одна идея, которую я услышал, заключалась в том, что, возможно, потребительский поток ... прямо перед выходом ... каким-то образом атомарно выменяет указатель очереди, чтобы при следующем вызове он вызывал что-то еще, что могло бы обработать сообщение по-другому.сейчас ..
то есть вызов: m_buffer-> push (message), где m_buffer - указатель на tbb :: concurrent_queue, должен после того, как поток потребителя завершится, по-прежнему выглядеть как m_buffer-> push (message), за исключением егоуходит куда-то еще ... мой собственный обработчик или около того ...
Как я могу это сделать?Я не могу поменять местами m_buffer, чтобы он указывал на любой другой пользовательский класс, если я не наследую от tbb :: concurrent_queue ... есть ли другой способ обойти это?
Спасибо