У меня очень важная задача в моей основной теме. Тем не менее, я также хотел бы одновременно напечатать некоторую информацию об этой задаче.cout on extra thread - thread safety
Задача: cout
занимает некоторое время для выполнения и, следовательно, замедляет задачу, чувствительную к времени, в основном потоке.
Idea: Я думал о создании дополнительного потока, который обрабатывает выходные данные. Для связи между основным потоком и вновь созданным потоком я думал о векторе, который включает строки, которые должны быть напечатаны. Во вновь созданном потоке бесконечный цикл while будет печатать эти строки один за другим.
Проблема с идеей: Векторы не являются потокобезопасными. Поэтому я беспокоюсь, что блокировка и разблокировка вектора займет почти столько же времени, сколько потребуется при вызове cout
непосредственно в основной теме.
Вопрос: Есть ли альтернатива блокировке/разблокировке вектора? Я беспокоюсь о том, что блокировка вектора ошибочна? Не могли бы вы принять совершенно другой подход к решению проблемы?
Вам следует попробовать блокировать и разблокировать, чтобы проверить, действительно ли это узкое место в вашем приложении. А может и не быть. В противном случае рассмотрите блокированные структуры данных, такие как [boost :: lockfree :: queue] (http://www.boost.org/doc/libs/1_59_0/doc/html/boost/lockfree/queue.html) или [ повышение :: lockfree :: spsc_queue] (http://www.boost.org/doc/libs/1_59_0/doc/html/boost/lockfree/spsc_queue.html). – crayzeewulf
Эти блокирующие данные выглядят многообещающими. Я не знал, что у boost были такие структуры данных очереди. Я буду реализовывать их завтра! Спасибо за вашу поддержку. – chrisp