- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我有通过 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/
我想知道 cout<
这可能是一个初学者问题,了解 cout 的工作原理可能是这里的关键。如果有人可以链接到一个好的解释,那就太好了。 cout(&cout) 的地址. cout << &cout打印出 cout 的地址.
经过一整天的编码,我不小心写了 cout << "some text" << cout; 代替 cout << "some text" << endl; 现在它打印出一个内存地址。它指向什么? 最佳答
这与 difference-between-cout-x-and-cout-operator-x 有关问题,但还是有点不同... #include int main(){ std::cout
我是 C++ 的新手,最近我花了几天时间阅读有关指针的内容。我意识到下面的 2 段代码给我不同的结果,尽管它们看起来相同。 第一段代码: int a = 5; int* ptr = &a; cout
我尝试使用更短的语法并避免在任何地方使用 std::,所以我开始使用新的别名语法。在一些例子中,我看到人们这样使用它: using json = nlohmann::json; 并尝试使用 std::
这是我的头文件 #ifndef KINGDOM_H_ #define KINGDOM_H_ #include using namespace std; namespace sict{ cla
我经常遇到要将二维数组打印到屏幕或文件的情况。我的标准方法是这样的: for(int q=0; q #include void printNumber(int x) { std::cout
有一些 cout 语句,但第一个 cout 语句末尾的空格出现在第二个 cout 语句的开头。这是代码: #include int main() { using namespace std;
我在搞乱代码时遇到了这种相当模糊的行为,这是示例: #include using namespace std; int print(void); int main(void) { cout
我收到所有 cout 和 endl 的这些错误消息: main.cc:17:5: error: ‘cout’ was not declared in this scope main.cc:17:5:
这个问题在这里已经有了答案: What is the meaning of prepended double colon "::"? (9 个回答) 关闭 7 个月前。 有一个简单的代码,包含::操
我有下面的代码,我不太明白为什么结果恰好像下面这样: #include #include using namespace std; int main () { std::stringstre
在 C++ 中,当我在 .h 文件中声明自己的命名空间时,如下所示: namespace my_own { //... } 那么,如果我在命名空间 my_own 内部或外部声明 using s
背景 IIRC,来自 Release 2.0 C++ 将单字符常量存储为类型 char而不是 int .但是在 Release 2.0 之前声明如下 cout #include using name
Problem was in IDE I am using - CLion 1.2.4 gives incorrect output inside its own output window, sol
我知道有几个这样的拷贝,但到目前为止,没有一个对我有用。我正在尝试使用 g++ 在 Ubuntu 上编译一个非常简单的 C++ 程序,但它给了我范围错误。 #include using namesp
我在这里有一个难题,我无法解决,也没有在网上找到正确的答案: 我创建了一个带有清理路由的分离线程,问题是在我的 Imac 和 Ubuntu 9.1(双核)上。我无法正确取消空闲代码中的分离线程: #i
#include #include #include using namespace std; int main() { ofstream fout("test.txt"); f
我是一名优秀的程序员,十分优秀!