【发布时间】:2016-02-23 19:33:58
【问题描述】:
所以我有这个小sn-p代码:
int a = 10;
bool finished = false;
#pragma omp parallel num_threads(3) shared(a, finished)
{
while(!finished) {
#pragma omp single nowait
{
printf("[%d] a is: %d\n", omp_get_thread_num(), a);
a--;
finished = true;
}
}
}
输出是
[0] a is: 10
[2] a is: 10
[1] a is: 10
这根本不是我所期望的。我意识到所有线程都可能在退出while循环之前进入单个构造,但是为什么它们都说相同的a?进入的第二个线程应该有 a = 9,第三个线程应该有 a = 8。 我在 a 上尝试过 #pragma omp flush 和 #pragma omp atomic 但没有用。我想在该块中使用 a 进行比较(即 if(a == 10)),因此一旦另一个线程进入单个块,更新值至关重要。我做错了什么?
【问题讨论】:
标签: c multithreading openmp shared-memory