博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TBB之Atomic
阅读量:4058 次
发布时间:2019-05-25

本文共 1057 字,大约阅读时间需要 3 分钟。

通过使用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
counter;unsigned GetUniqueInteger() { return counter.fetch_and_add(1);}

下面这种情况,atomic类型的对象X被初始化成0:

atomic
x; // zero-initialized because it is at file scopeclass Foo { atomic
y; atomic
notzeroed; static atomic
z;public: Foo() : y() // zero-initializes y. { // notzeroed has unspecified value here. }};atomic
Foo::z; // zero-initialized because it is a static member
你可能感兴趣的文章
自己编写的NIO非阻塞聊天室
查看>>
毕业生的来清醒一下
查看>>
EL第四节课回想
查看>>
一些界面标准规范
查看>>
不是人过的四天!
查看>>
Roller2.1的配置手册
查看>>
关于session的详细解释
查看>>
Just one month!
查看>>
Reading Design Patterns
查看>>
华为公司 java 面试题
查看>>
走好创业之路第一步——创业时机的选择与目标的设定
查看>>
软件项目计划如何编写
查看>>
10 Places You Must Use Ajax
查看>>
刷脸支付青蛙Pro打通微信卡包小程序
查看>>
Flutter 事件分发流程
查看>>
大数据分析需要什么技术架构?
查看>>
Java开发有必要转大数据吗?
查看>>
Scala对于大数据开发重要吗?Scala基础学习建议
查看>>
Java大数据方向:入行Java大数据值得吗
查看>>
转行大数据还是人工智能,哪个发展更好
查看>>