我想學習如何使用原子:)與原子線程安全的這個功能
class foo {
static std::atomic<uint32_t> count_;
uint32 increase_and_get() {
uint32 t = count_++;
return t;
}
}
是功能increase_and_get()
線程安全的?
我想學習如何使用原子:)與原子線程安全的這個功能
class foo {
static std::atomic<uint32_t> count_;
uint32 increase_and_get() {
uint32 t = count_++;
return t;
}
}
是功能increase_and_get()
線程安全的?
是的,它是安全的:增量是原子的,本地t
不能被併發線程改變。您可以進一步簡化您的代碼以完全消除臨時變量:
uint32 increase_and_get() {
return count_++;
}
如果沒有原子,內存位置的增量不能保證是原子的,否。即使在x86上,也有可能兩個處理器試圖一次增加,並且在沒有原子的情況下,它可能會導致來自兩個不同調用的相同值。 (回覆刪除的評論!) – 2013-02-27 02:23:43
@MatsPetersson這是'std :: atomic'的整點,不是嗎? – mfontanini 2013-02-27 02:24:47
我剛剛編輯了我的評論 - 請注意,這是作爲回覆評論,顯然已被刪除。 – 2013-02-27 02:25:36
是的,這將是線程安全的。假設當然在std::atomic
實現中沒有錯誤 - 但通常很難做到正確。這是std::atomic
的意思。
它的實現方式我會調用這個'get_and_increase'而不是'increase_and_get'。 – jogojapan 2013-02-27 02:28:48