我正在阅读boost::shared_ptr
源代码并发现它使用此函数来增加shared_ptr的使用次数(引用次数):
inline void atomic_increment( int * pw )
{
//atomic_exchange_and_add( pw, 1 );
__asm__
(
"lock\n\t"
"incl %0":
"=m"( *pw ): // output (%0)
"m"( *pw ): // input (%1)
"cc" // clobbers
);
}
为什么不简单地使用operator++
来执行此操作?这会带来更好的表现吗?
答案 0 :(得分:9)
++运算符读取它的操作数的当前值,加1并将结果写回。这可以是三个可中断的(即,通过另一个线程)步骤。如果两个线程同时执行此操作,则结果可能是错误的。为了防止这种情况,必须使用原子操作或锁定。这是通过上面显示的asm代码完成的。
答案 1 :(得分:3)
C ++标准不保证i ++或++ i操作是原子的。所以取决于编译器,它可能是也可能不是原子的。此解决方法使用汇编语言来解决此限制。
现在,C ++标准包括std::atomic<T>
,它保证对象上的操作是原子的。