我有使用OpenMP线程通过cout和cerr写入控制台的代码。这显然是不安全的,因为输出可能会交错。我可以采取以下措施:
#pragma omp critical(cerr)
{
cerr << "my variable: " << variable << endl;
}
如果能使用类似于valgrind DRD手册中所解释的方法(http://valgrind.org/docs/manual/drd-manual.html#drd-manual.effective-use),从std :: ostreambuf派生一个类,以替换cerr为线程安全版本,那就更好了。最理想的情况是最终我只需将cerr替换为自己的线程化cerr,例如:
tcerr << "my variable: " << variable << endl;
这样的类可以在遇到“endl”时立即打印到控制台。我不介意来自不同线程的行交错,但每行只能来自一个线程。
我真的不理解C ++中所有这种流式处理是如何工作的,它太复杂了。有没有人有这样的类或可以向我展示如何为此创建这样的类?
printf
或write
有什么问题吗?在stringstream中构建字符串,然后使用printf
/write
对整行进行原子写入... - David Rodríguez - dribeasoperator<<
,这意味着不同线程的输出可能会混合产生:myvariable: myvariable: 345
(现在请想象一下这些值是3
和45
还是34
和5
:)) - David Rodríguez - dribeas