为什么boost :: shared_ptr使用gcc内联汇编来增加use_count而不是使用operator ++?

时间:2012-07-18 01:09:24

标签: c++ boost thread-safety shared-ptr atomicity

我正在阅读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++来执行此操作?这会带来更好的表现吗?

2 个答案:

答案 0 :(得分:9)

++运算符读取它的操作数的当前值,加1并将结果写回。这可以是三个可中断的(即,通过另一个线程)步骤。如果两个线程同时执行此操作,则结果可能是错误的。为了防止这种情况,必须使用原子操作或锁定。这是通过上面显示的asm代码完成的。

答案 1 :(得分:3)

C ++标准不保证i ++或++ i操作是原子的。所以取决于编译器,它可能是也可能不是原子的。此解决方法使用汇编语言来解决此限制。 现在,C ++标准包括std::atomic<T>,它保证对象上的操作是原子的。