【发布时间】:2016-06-23 14:29:56
【问题描述】:
请看以下代码 sn-p 使用 OpenMP 进行并行化:
char lock = 0;
#pragma omp parallel
{
while(!__sync_bool_compare_and_swap(&lock, 0, 1));
printf("Thread: %d is working!\n", omp_get_thread_num());
sleep(1);
printf("Thread: %d unlocks lock!\n", omp_get_thread_num());
lock = 0;
}
是否有可能线程同时锁定锁,即使锁定是原子的 __sync_bool_compare_and_swap? 例如,并非所有线程都具有一致的内存视图?
【问题讨论】:
-
__sync_*()是一个完整的障碍,lock = 0;不是。 -
你为什么要这样做? OpenMP 正是为了提供适当的抽象而设计的,例如
#pragma omp crtical在你的情况下。从description of__sync_bool_compare_and_swap开始,我强烈假设内存屏障用于强制执行一致的内存视图。但正如 EOF 所注意到的,lock = 0;可能由于重新排序而成为问题。 -
虽然我完全同意你的看法,但我目前正在使用我尚未编写的代码,并且在这段代码中,同步得到了加强,就像我在代码中呈现它的方式一样。并且 Intel Inspector 会检测竞争条件,如果同步按我预期的那样工作,这应该是不可能的。
-
可以想象英特尔 Inspector 会产生误报吗?
标签: c multithreading openmp intrinsics