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
原创粉丝点击