std::cout 来自多个线程
std::cout from multiple threads
我有一个应用程序,其中我在并行工作线程中执行昂贵的计算。为简单起见,我直接从这些线程将结果写入标准输出。
这工作正常,直到我更改了一些内容以使代码运行得更快。首先,我将 std::endl 替换为 "" 以防止每行后刷新。我将以下行添加到主程序的 init 部分:
std::cin.tie(nullptr);
std::ios_base::sync_with_stdio(false);
工作线程代码的基本结构如下所示:
while(true) {
// get data from job queue, protected by unique_lock on std::mutex
// process the data
// print results
{
std::lock_guard<std::mutex> lk(outputMutex_);
std::cout << "print many results" << "n"; // was originally std::endl
}
}
由于这种"优化",工人的输出偶尔会"混合",即互斥体不能达到其预期目的。
为什么会这样?我的理解是,只有一个标准输出流缓冲区,即使输出在释放互斥锁之前没有从该缓冲区刷新,数据也会按顺序到达相应的缓冲区。但事实似乎并非如此...
(我意识到在单独的线程中生成输出可能会更好,但是我需要使用另一个队列传回这些结果,这在这里似乎没有必要(
更新:也许我的帖子不够清楚。我不在乎结果的顺序。问题是(对于上面的例子(而不是这个:
print many results
print many results
print many results
我有时会得到:
print many print many results
results
print many results
outputMutex_是所有工作线程共享的静态成员。
您正在通过多个线程访问cout。对其队列的访问受互斥锁保护,但需要刷新。这不会自动发生(总是至少:)
(std::endl
脸红了,"n'
没有
或者,你可以告诉Cout冲洗,std::flush
:
https://en.cppreference.com/w/cpp/io/manip/flush
尝试:
while(true) {
// get data from job queue, protected by unique_lock on std::mutex
// process the data
// print results
{
std::lock_guard<std::mutex> lk(outputMutex_);
std::cout << "print many results" << "n"; // not flushed
std::cout << std::flush; // flushed!
std::cout << "print something else" << std::endl; // flushed!
}
}
更多关于: https://stackoverflow.com/a/22026764/13735754
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在C++中使用cURL和多线程
- std::cout 来自多个线程
- 带有 std::cout 的多线程控制台文本动画
- 在使用 std::cout 和多线程程序中如何避免数据竞争<iomanip>?
- 死锁使用 std::mutex 来保护多个线程中的 cout
- if 语句仅在前面有调试 cout 行(C 中的多线程)时才通过
- 将 std::cout 从单独线程中的 DLL 重定向到 QTextEdit
- 线程安全std::cout的死锁
- 提升线程:cout 行为
- 在 c++ 中多线程处理时与 cout 和 printf 的区别
- 用于多线程的快速同步cout
- 在多个线程中使用std::cout
- 同步STD cout输出多线程
- 如果不使用 pthread_join(),为什么'cout'语句从特定线程打印两次(即使它是同步的)?
- c++: Linux:管道到我的程序从多个线程或流,而不是' cout '
- 循环system()和cout的线程会破坏堆栈
- 多个线程写入std::cout或std::cerr
- IOstream线程安全,必须将cout和cerr分开锁定