作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
#include "/usr/lib/gcc/i686-linux-gnu/4.6/include/omp.h"
#include <iostream>
#include<list>
using namespace std;
int main()
{
list<int> lst;
for(int i=0;i<5;i++)
lst.push_back(i);
#pragma omp parallel for
for(int i=0;i<5;i++)
{
cout<<i<<" "<<omp_get_thread_num()<<endl;
}
}
假设我能得到这个:
0 0
1 0
2 0
3 1
4 1
但是,有时我会得到这样的结果:
30 0
1 0
2 0
1
4 1
甚至是这样的结果:
30 1 0
4 1
1 0
2 0
我知道这是因为输出代码:
cout<<i<<" "<<omp_get_thread_num()<<endl;
被拼接成小段,做输出时没有顺序。但是谁能告诉我如何防止这种情况发生呢?谢谢。
最佳答案
标准输出流不同步!
标准给出的唯一保证是,单个字符以原子方式输出。
您需要一个锁——它违背了并行化点,或者您可以删除“<< i”,这将导致准同步行为。
关于c++ - OpenMP - 并行代码有意想不到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14498981/
我是一名优秀的程序员,十分优秀!