簡體   English   中英

為什么boost :: shared_ptr使用gcc內聯匯編來增加use_count而不是使用operator ++?

[英]Why does boost::shared_ptr use gcc inline assembly to increase use_count instead of using operator++?

我正在讀取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++來做到這一點? 這會帶來更好的表現嗎?

++運算符讀取它的操作數的當前值,加1並將結果寫回。 這可以是三個可中斷的(即,通過另一個線程)步驟。 如果兩個線程同時執行此操作,則結果可能是錯誤的。 為了防止這種情況,必須使用原子操作或鎖定。 這是通過上面顯示的asm代碼完成的。

C ++標准不保證i ++或++ i操作是原子的。 所以取決於編譯器,它可能是也可能不是原子的。 此解決方法使用匯編語言來解決此限制。 現在,C ++標准包括std::atomic<T> ,它保證對象上的操作是原子的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM