一起来学OpenMP(6)——线程同步之atomic
2014-06-08 11:16
323 查看
原文链接
一、引言
在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
四、示例
[cpp] view
plaincopy
#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的用法,下一节介绍临界区的用法。
一、引言
在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
四、示例
[cpp] view
plaincopy
#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的用法,下一节介绍临界区的用法。
相关文章推荐
- 一起来学OpenMP(6)——线程同步之atomic
- 一起来学OpenMP(6)——线程同步之atomic
- 一起来学OpenMP(6)——线程同步之atomic
- 一起来学OpenMP(8)——线程同步之互斥锁函数
- 一起来学OpenMP(9)——线程同步之事件同步机制
- 一起来学OpenMP(7)——线程同步之临界区
- 一起来学OpenMP(8)——线程同步之互斥锁函数
- 一起来学OpenMP(9)——线程同步之事件同步机制
- 一起来学OpenMP(7)——线程同步之临界区
- 一起来学OpenMP(7)——线程同步之临界区
- 一起来学OpenMP(9)——线程同步之事件同步机制
- 一起来学OpenMP(1)——初体验
- OpenMP:线程同步
- 一起来学OpenMP(2)——常用的库函数
- OpenMP(三) 线程同步
- 一起来学OpenMP(10)——线程的调度优化
- 一起来学OpenMP(1)——初体验
- 一起来学OpenMP(2)——常用的库函数
- 一起来学OpenMP(3)——for循环并行化基本用法
- 一起来学OpenMP(4)——数据的共享与私有化