我有通过 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++ 中的所有这些流是如何工作的,它太复杂了。有没有人这样的课程或可以告诉我如何为此目的创建这样的课程?