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