Простой способ избежать столкновения засоров из разных потоков?
У меня есть многопоточная программа, где два отдельных потока отправляют выходные данные отладки в std::clog, а выходные данные чередуются. Я хотел бы найти простой способ заставить вывод, по крайней мере, хранить отдельно, за исключением перевода строки в выводе. Таким образом, выходные данные отладки могут быть более легко интерпретированы. В некоторых местах я вставлял sleep(1) перед выводом и собирал вывод в строку перед отправкой на засорение, чтобы уменьшить вероятность столкновения, но я бы предпочел более надежное и надежное решение.
Есть ли простой способ убедиться, что каждый поток записывает целую строку за раз в std::clog, прежде чем другой поток сможет войти и написать свою собственную строку вывода?
3 ответа
Там нет особенно простой способ сделать это, и есть расширенное обсуждение этого здесь: http://www.cplusplus.com/forum/general/27760/
Проблема там несколько решена с созданием нового AtomicStream
это пишет целую строку атомарно, прежде чем что-либо еще передается (это делается с помощью приемов буферизации). Вам нужно будет придумать подобное решение. Извините за непростой ответ - синхронизация потоков так или иначе должна будет сделать это в вашем решении.
Это может быть производным, но если ваш std::clog
перенаправляет в файл, вы также можете иметь несколько файлов для нескольких потоков.
Ты... не можешь. Вы пишете в один и тот же поток одновременно. Буферизация в clog
немного поможет, но гарантий пока нет.
Если вы не хотите синхронизировать ведение журнала ваших потоков (что довольно дорого для того, что вы делаете), возможно, вам следует вместо этого использовать средство ведения журнала (это позволит вам регистрировать, например, разные файлы для разных вещей).
Да, вы ищите метод синхронизации между потоками. Обычно они доступны в API операционной системы, вы также можете найти его в Boost.