【发布时间】:2019-01-07 09:30:27
【问题描述】:
我有一些在 c++11 标准下编译的代码。我有多个线程写入 cout。我注意到在写很多行时,会有一些行丢失的情况(比如 2000000 行中有 1 行)。我很惊讶地看到这一点,因为我的字符串(下面的outStr)对于每个线程都是本地的,而且我在写入标准输出时有一个关键部分。当我刷新流时,我注意到问题消失了。
#pragma omp critical(cout)
{
cout << outStr;
cout.flush();
}
这是预期的行为吗?真正欺骗我的是,当我写的行数相对较少(
总的来说,我对关键部分并不满意,因为我在分析中注意到它引起了很多争论。我愿意接受任何改进我的 I/O 的建议。
*编辑我的印象是,在 c++11 下,只要我同步我的输出(即当我使用关键部分时没有交错或丢失输出),我的输出就不会损坏,但似乎缺少的行表示如果不刷新输出,这不是保证。
【问题讨论】:
-
我不知道消失的行有什么问题,但我会写入单独的文件并在运行结束时将它们合并。
-
@n.m.如果这是管道的一部分,那么能够在不先写入磁盘的情况下写入标准输出是很好的。
-
@john 另一个问题没有提到仅在输出同步时才需要刷新。如果 c++11 中的
cout是线程安全的,它是相似的,但没有解决为什么我的输出中会丢失一些字符串。 -
我同意,如果我们只看问题的“标题”,另一个可能是重复的,但实际上这两个问题确实完全不同。我已经编辑了这个标题,以更准确地反映我认为这个问题的真正意图。
-
另一种方法是使用单个专用写入器和一些无锁队列将消息从工作器传递到写入器。
标签: c++ c++11 openmp cout flush