Быстро синхронизированный cout для многопоточности

Недавно я столкнулся с довольно распространенной проблемой использования cout в многопоточном приложении, но с небольшими изменениями. У меня есть несколько функций обратного вызова, которые вызываются внешним оборудованием через драйвер. Основная цель функций обратного вызова — получить некоторые данные и сохранить их в очереди и сообщить о задаче обработки, как только будет получено определенное количество наборов данных. Функция обратного вызова должна работать как можно быстрее, чтобы реагировать на аппаратное обеспечение в режиме реального времени.
Моя проблема заключается в следующем: время от времени моя очередь заполняется, и я должен разобраться с этим делом, распечатав предупреждение на консоль (жесткое требование). Поскольку я работаю с несколькими потоками, я создал функцию-обертку, которая использует мьютекс для синхронизации cout. К сожалению, в некоторых случаях ожидание доступа к cout может занять так много времени, что моя функция обратного вызова не завершается достаточно быстро, чтобы ответить аппаратному обеспечению до истечения времени ожидания. Мое решение состояло в том, чтобы использовать атомарную переменную для каждой возможной ошибки, чтобы подсчитать количество вхождений, и еще одну задачу — периодически проверять эти переменные и впоследствии распечатывать сообщения, но я уверен, что это не лучший подход для решения моей проблемы. проблемы с производительностью.
Существуют ли общие подходы для такого рода проблем?
Любые рекомендации, как я мог бы улучшить или упростить свое решение?

заранее спасибо

0

Решение

Не пишите вывод в горячем пути.

Вместо этого поставьте в очередь материал, который вы хотите записать (предпочтительно необработанные данные, а не полностью отформатированную строку). Запустите другой поток OOB, который подберет этот материал и зарегистрирует его.

4

Другие решения


По вопросам рекламы [email protected]