一、引言
在OpenMP中,线程同步机制包括互斥锁同步机制和事件同步机制。本节介绍互斥锁同步机制中的atomic方法。
二、互斥锁同步的概念
互斥锁同步的概念类似于Windows中的临界区(CriticalSection)以及Windows和Linux中的Mutex,以及VxWorks中的SemTake何SemGive(初始化时信号量为满),即对某一块代码操作进行保护,以保证同时只能有一个线程执行该段代码。
三、atomic(原子)操作语法
#pragma opm atomic
x< + or * or - or * or / or & or | or << or >> >=expr
(例如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的用法,下一节介绍临界区的用法。