gpt4 book ai didi

c++ - OpenMP - 并行代码有意想不到的结果

转载 作者:行者123 更新时间:2023-11-30 02:01:05 25 4
gpt4 key购买 nike

#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/

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