gpt4 book ai didi

c++ - 多个线程写入 std::cout 或 std::cerr

转载 作者:IT老高 更新时间:2023-10-28 23:03:26 25 4
gpt4 key购买 nike

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

最佳答案

正如其他人指出的,在 C++11 中,std::cout 线程安全的。

但是如果你像这样使用它

std::cout << 1 << 2 << 3;

使用不同的线程,输出仍然可以交错,因为每个 <<是一个新的函数调用,可以在另一个线程上的任何函数调用之前。

为了避免交错没有 #pragma omp critical - 这将锁定所有内容 - 您可以执行以下操作:

std::stringstream stream; // #include <sstream> for this
stream << 1 << 2 << 3;
std::cout << stream.str();

将 123 写入流的三个调用仅发生在一个本地非共享对象的线程中,因此不受任何其他线程的影响。然后,只有一次调用共享输出流 std::cout ,其中项目 123 的顺序已经固定,因此不会弄乱。

关于c++ - 多个线程写入 std::cout 或 std::cerr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15033827/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com