在OpenMP的程序中,原子操作的功能是通过#pragma omp atomic
编译制导指令提供的。critical
临界区操作能够作用在任意大小的代码块上,而原子操作只能作用在单条赋值语句中,C\C++中可用的原子操作如下:+ - * / & ^ | << >>
atomic在使用中需要注意:
- 当对一个数据进行原子操作的时候,就不能对数据进行临界区的保护
- 用户在针对同一个内存单元使用院子操作的时候,需要在程序所有涉及到该变量并行赋值的部位都加入原子操作的保护。
例:
#include <stdio.h>
#include <omp.h>
int main()
{
omp_set_num_threads(2);
int counter = 0, i;
#pragma omp parallel
{
for (i = 0; i < 10000; i++)
{
#pragma omp atomic
counter++;
}
}
printf("counter = %d\n", counter);
return 0;
}
由于使用atomic语句,避免了可能出现的数据访问竞争情况,最后的执行结果都是一致的,执行结果总是counter = 20000
(假设有两个并发线程)。