簡體   English   中英

c ++ atomic vs lock

[英]c++ atomic vs lock

假設我有一個類foo:

class foo {
    static uint32 count_;
    pthread_mutex_t mu;

    void increase() {
      pthread_mutex_lock(&mu);
      count_++;
      pthread_mutex_unlock(&mu);
    }
}

如果我不使用互斥鎖,但是只有一個std :: atomic作為count_,有什么區別嗎?

謝謝!

這是個很大的差異。 pthread_mutex_lock可能非常昂貴,因為它可能包含一個系統調用*。 原子增量產生lock xadd

另一個優點是std::atomic<...>可能更好的可移植性,因為它是C ++標准的一部分。 Pthread調用很可能不適用於Windows。

*)如果某個其他線程已經持有鎖,則讓當前線程休眠。 但很可能只會發生自旋鎖

事實上,互斥鎖實際上很可能是作為一個原子增量實現的,並且如果你在鎖上獲得爭用的運氣不好,還涉及系統調用[假設當然,它不是一個系統無論如何都要打電話!]。

x86上的原子解決方案將是一個簡單的“鎖定添加”操作。 在其他處理器上它可能更復雜,但即便如此,原子是互斥量所需的最小值,因此無論如何你至少要有這么多的工作量。

然后你添加互斥鎖解鎖,這可能不是那么復雜,但它不會完全免費。

所以,是的,去原子。

但是就像所有與性能有關的事情一樣,請測量“之前”和“之后”,看看它確實提高了性能。

請注意,我看到有人解釋說原來的gnu C ++標准庫實現實際上是使用某種互斥操作完成的,但我相信如果你有一個合理的最新版本的g ++它應該沒問題(至少對於x86類型的處理器) )。 微軟很長一段時間都支持內置的正確的原子操作,所以應該沒問題。 其他處理器架構可能有所不同。

暫無
暫無

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

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