在单核多线程程序中,对临界变量以及临界区的访问,是atomic方式的。在OpenMP中,由于是多个thread共同负责完成一个任务,所以必然有访问操作(回写)
同一个变量的情形,OpenMP引入atomic directive应对这种情形。
测试代码:
void testAtomic()
{
omp_set_num_threads( 4 );
int sum = 0;
#pragma omp parallel for
for(int i = 1; i <= 100; i++)
#pragma omp atomic
sum += i;
printf("sum = %d/n", sum);
}
测试结果:
sum = 5050
如果不使用atomic
void testAtomic()
{
omp_set_num_threads( 4 );
int sum = 0;
#pragma omp parallel for
for(int i = 1; i <= 100; i++)
//#pragma omp atomic
sum += i;
printf("sum = %d/n", sum);
}
那么结果是不对的,而且每次运行的结果可能不同。这种现象的原因跟单核多线程临界变量是相同的。这样看来,单核多线程的理论可以帮助更好更快的
理解OpenMP。