Простой способ избежать столкновения засоров из разных потоков?

У меня есть многопоточная программа, в которой два отдельных потока отправляют выходные данные отладки в std::clog, а выходные данные перемежаются. Я хотел бы найти простой способ заставить вывод, по крайней мере, быть отдельным, за исключением перевода строки на выходе. Таким образом, вывод отладки может быть более легко интерпретирован. В некоторых местах я вставлял sleep(1) перед выводом и собирал вывод в строку перед отправкой в ​​засорение, чтобы уменьшить вероятность коллизии, но я бы предпочел более надежное и надежное решение.

Есть ли простой способ гарантировать, что каждый поток записывает целую строку за раз в std::clog до того, как другой поток сможет войти и написать свою собственную строку вывода?


person WilliamKF    schedule 01.05.2011    source источник


Ответы (3)


Не существует особенно простого способа сделать это, и здесь есть подробное обсуждение этого вопроса: http://www.cplusplus.com/forum/general/27760/

Проблема частично решена созданием нового AtomicStream, который записывает целую строку атомарно, прежде чем что-либо еще будет передано в поток (это делается с помощью трюков с буферизацией). Вам нужно будет придумать аналогичное решение. Извините за непростой ответ - синхронизация потоков каким-то образом должна будет войти в ваше решение.

Это может быть производным, но если ваш std::clog перенаправляет в файл, у вас также может быть несколько файлов для нескольких потоков.

person David Titarenco    schedule 01.05.2011

Вы... не можете. Вы пишете в один и тот же поток в одно и то же время. Буферизация в clog немного поможет, но гарантий пока нет.

Если вы не хотите синхронизировать ведение журнала ваших потоков (что-то дорогое для того, что вы делаете), возможно, вам следует вместо этого использовать средство ведения журнала (это позволит вам регистрировать разные файлы для разных вещей).

person Brian Roach    schedule 01.05.2011

Да, вы ищете метод синхронизации между потоками. Обычно они доступны в API операционной системы, вы также можете найти их в Boost.

person Puppy    schedule 01.05.2011