【发布时间】:2013-02-08 15:22:06
【问题描述】:
我有通过 cout 和 cerr 写入控制台的 OpenMP 线程。这当然是不安全的,因为输出可以交错。我可以做类似的事情
#pragma omp critical(cerr)
{
cerr << "my variable: " << variable << endl;
}
如果可以用线程安全版本替换 cerr 会更好,类似于 valgrind DRD 手册 (http://valgrind.org/docs/manual/drd-manual.html#drd-manual.effective-use) 中解释的方法,该方法涉及从 std::ostreambuf 派生一个类。理想情况下,最后我会用我自己的线程 cerr 替换 cerr,例如简单地说:
tcerr << "my variable: " << variable << endl;
这样的类可以在遇到“endl”时立即打印到控制台。我不介意来自不同线程的行是否交错,但每一行应该只来自一个线程。
我真的不明白 C++ 中的所有这些流是如何工作的,它太复杂了。有没有人有这样的课程,或者可以告诉我如何为此目的创建这样的课程?
【问题讨论】:
-
请不要建议 printf.. ;)
-
“这当然不安全” - 这在 C++11 中是不正确的,除非你有意识地采取行动使其成为现实。
-
你的标题是
cout而不是cerr。 -
@Wolfgang:
printf或write有什么问题?在字符串流中构建字符串,然后使用printf/write对整行进行原子写入... -
@AndyProwl:即使在 C++11 中,上面的代码也涉及到对
operator<<的多次调用,这意味着不同线程的输出可以混合产生:myvariable: myvariable: 345(现在看看是否这些值为3和45或34和5:))
标签: c++ multithreading openmp valgrind