Я рассматриваю возможность внедрения асинхронного журналирования. Это означает, что несколько рабочих потоков создают сообщения в памяти и помещают их в очередь без блокировок, а один поток журналирования использует эту очередь и выполняет блокирующие операции ввода-вывода в фоновом режиме. Недостатком этого подхода является то, что если какой-либо рабочий поток выдает неперехваченное исключение, вызывается std::terminate, и поток протоколирования может не завершить свой вывод. Это очень нежелательно, поэтому мне нужно убедиться, что перед завершением программы очередь будет очищена и все операции ввода-вывода будут завершены. Для простоты я рассматриваю случай, когда сам логгер не может вызвать завершение, и это завершение не вызвано исключением из статических или локальных объектов потока, не вызвано уничтожением присоединяемого потока и т. д.
Что произойдет с другими потоками, если один поток выдаст неперехваченное исключение? Могу ли я передать управление другим потокам из std::terminate, заблокировать мьютекс или реализовать ожидание занятости? Мне нужно предотвратить добавление новых сообщений в очередь журналирования, позволяя регистратору очистить ее, а затем мне нужно дождаться завершения ввода-вывода: должен ли я занят ожиданием атомарного сообщения?
Подробнее здесь: https://stackoverflow.com/questions/790 ... dterminate