2010-12-16 152 views
2

我是OpenMP中的完全noob,刚开始时通过探索下面的一些简单测试脚本。OpenMP C和C++ cout/printf不提供相同的输出

#pragma omp parallel 
    { 
     #pragma omp for 
      for(int i=0;i<10;++i) 
      std::cout<<i<<" "<<endl; 
     // printf("%d \n",i); 
    } 
} 

我试过C和C++版本,C版本似乎工作正常,而C++版本给我一个错误的输出。

+1

更具体的是什么是输出和你的期望(虽然我认为我可以在这种情况下推测后者)。 – 2010-12-16 10:55:25

回答

5

printf的许多实现获取锁以确保每个printf调用不被其他线程中断。

相反,std::cout的重载<<操作者表示(即使有锁)的i' ''\n'一个线程的印刷可以与另一个线程的输出进行交织,因为std::cout<<i<<" "<<endl;被转换成由C 3 operator<<()函数调用++编译器。

0

这是过时的,但也许这可能是还帮助任何人:

这不是真的清楚你期望的输出为,但要注意的是什么:

  1. 你的变量“i”可能在线程中共享。你对“我”的内容有竞争条件。当一个线程想要访问“我”时需要等待另一个线程。另外一个线程可以改变“我”,另一个线程不会记录它,这意味着它会输出一个错误的值。

  2. endl()在结束该行后刷新内存。如果你使用\ n作为换行符,效果是类似的,但没有刷新。 std也是一个对象,所以多个线程竞争std访问。当每次访问后内存不刷新时,您可能会遇到干扰。

为了确保这些与您的问题无关,您可以将“我”声明为私有,因此每个线程都计算“我”本身。你可以在输出时刷新内存,看看它是否与你遇到的问题有关。

相关问题