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

StackOverflow https://stackoverflow.com/questions/5851289

  •  27-10-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top