Простой способ избежать столкновения засоров из разных потоков? - PullRequest
2 голосов
/ 02 мая 2011

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

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

Ответы [ 3 ]

3 голосов
/ 02 мая 2011

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

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

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

1 голос
/ 02 мая 2011

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

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

0 голосов
/ 02 мая 2011

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

...