本文共 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的基本操作:
因为这些操作以原子形式发生的,他们可以在没有互斥锁的情况下安全的使用:
atomiccounter;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