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

ama*_*jxq 2 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
    );
}
Run Code Online (Sandbox Code Playgroud)

为什么不简单地使用operator++这样做呢?这会带来更好的表现吗?

tim*_*mos 9

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

  • 在C++ 11中,您应该使用std :: shared_ptr而不是boost :: shared_ptr (4认同)