2

我正在阅读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++来做到这一点?这会带来更好的性能吗?

4

2 回答 2

9

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

于 2012-07-18T01:26:35.687 回答
3

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

于 2012-07-18T01:32:57.203 回答