2013-02-27 63 views
3

我想學習如何使用原子:)與原子線程安全的這個功能

class foo { 
    static std::atomic<uint32_t> count_; 
    uint32 increase_and_get() { 
    uint32 t = count_++; 
    return t; 
    } 
} 

是功能increase_and_get()線程安全的?

+1

它的實現方式我會調用這個'get_and_increase'而不是'increase_and_get'。 – jogojapan 2013-02-27 02:28:48

回答

8

是的,它是安全的:增量是原子的,本地t不能被併發線程改變。您可以進一步簡化您的代碼以完全消除臨時變量:

uint32 increase_and_get() { 
    return count_++; 
} 
+1

如果沒有原子,內存位置的增量不能保證是原子的,否。即使在x86上,也有可能兩個處理器試圖一次增加,並且在沒有原子的情況下,它可能會導致來自兩個不同調用的相同值。 (回覆刪除的評論!) – 2013-02-27 02:23:43

+1

@MatsPetersson這是'std :: atomic'的整點,不是嗎? – mfontanini 2013-02-27 02:24:47

+1

我剛剛編輯了我的評論 - 請注意,這是作爲回覆評論,顯然已被刪除。 – 2013-02-27 02:25:36

4

是的,這將是線程安全的。假設當然在std::atomic實現中沒有錯誤 - 但通常很難做到正確。這是std::atomic的意思。