一起来学OpenMP(6)——线程同步之atomic

一、引言
在OpenMP中,线程同步机制包括互斥锁同步机制和事件同步机制。本节介绍互斥锁同步机制中的atomic方法。
二、互斥锁同步的概念
互斥锁同步的概念类似于Windows中的临界区(CriticalSection)以及Windows和Linux中的Mutex,以及 VxWorks中的SemTake何SemGive(初始化时信号量为满),即对某一块代码操作进行保护,以保证同时只能有一个线程执行该段代码。
三、atomic(原子)操作语法
#pragma opm atomic
x< + or * or - or * or
(例如x <<= 1; or x *=2;)
或
#pragma opm atomic
x++ //or x--, --x, ++x
可以看到atomic的操作仅适用于两种情况:
1. 自加减操作
2. x<上述列出的操作赴>=expr
四、示例
- #include
<iostream> - #include
<omp.h> // OpenMP编程需要包含的头文件 -
- int
main() - {
-
int sum = 0; -
-
std::cout << "Before: " << sum << std::endl; -
- #pragma
omp parallel for -
for (int i = 0; i < 20000; ++i) -
{ - #pragma
omp atomic -
sum++; -
} -
-
std::cout << "After: " << sum << std::endl; -
return 0; - }
输出20000。
如果将#pragma omp atomic声明去掉,则输出值不确定。
五、小节
本节介绍了atomic的用法,下一节介绍临界区的用法。