TBB之Atomic
来源:互联网 发布:如何练形体气质知乎 编辑:程序博客网 时间:2024/05/20 17:59
通过使用atomic操作避免使用互斥锁,当一个线程执行一个atomic操作,其他线程挂起,atomic操作的优点是它们相对locks更快,不会有deadlock和convoying的现象,缺点是它们只能做有限的操作,常常没有足够同步更复杂的操作,但是你不应该放弃使用atomic操作的机会而去使用互斥锁,类atomic实现c++风格的的操作。
atomic操作的典型应用是线程安全的引用计数。假设x是一个类型为int的引用计数,当引用计数变成0时,需要程序做一些行为。在单一线程中,你能使用int型的x并且–x;if(x==0) action()。但是这种方法对多线程可能是失败的,因为2个线程可能交叉下面的操作:
x是在2个线程中分开操作,如果x=2,在线程评估if条件之前2个线程对x做减少操作,2个线程调用action(),为了更正这个问题,你需要同一时间只有个线程减少,确保通过if检测的值是减少的结果。你能使用互斥锁,但是使用atomic::operator–是更快更简单的方法。
atomic支持类型T的atomic操作,一定是整型、枚举或者是指针类型,有5个基本操作,附带运算符重载的接口。例如,对atomic的++,–,-=以及+=操作,下面是5个对atomic类型变量x的基本操作:
因为这些操作以原子形式发生的,他们可以在没有互斥锁的情况下安全的使用:
atomic<unsigned> counter;unsigned GetUniqueInteger() { return counter.fetch_and_add(1);}
下面这种情况,atomic类型的对象X被初始化成0:
atomic<int> x; // zero-initialized because it is at file scopeclass Foo { atomic<int> y; atomic<int> notzeroed; static atomic<int> z;public: Foo() : y() // zero-initializes y. { // notzeroed has unspecified value here. }};atomic<int> Foo::z; // zero-initialized because it is a static member
0 0
- TBB之Atomic
- TBB基础之parallel_for
- TBB基础之parallel_for
- TBB基础之parallel_for
- TBB之parallel_for
- TBB之parallel_reduce
- TBB之parallel_do
- TBB之pipeline
- TBB之concurrent_hash_map
- TBB之concurrent_vector
- TBB之Timing
- TBB之task
- TBB之Exceptions and Cancellation
- JUC之Atomic
- JUC 之 atomic
- atomic包之AtomicBoolean
- TBB基础之初始化&amp;终止
- tbb基础之parallel_for用法详解
- Android Input子系统驱动部分
- 项目所用账号密码更改提醒
- Light OJ 1050 Marbles (概率DP)
- Java调用webService接口方法总结
- 离散化求RECT1
- TBB之Atomic
- Schemaless架构(二):Uber基于MySQL的Trip数据库
- android 实现倒计时和计时的5种方法
- USACO 6.1.3 RECT1 离散化
- SSH-Strut
- 机器学习人群扩散(LPA算法)
- 189Rotate Array
- JavaScript中变量提升------Hoisting
- Fabled Rooks