TBB之Atomic

通过使用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 scope

class 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值