我有一個線程安全計數器對象(它是一個使用std :: atomic load()和store()) 作爲類成員之一的類。線程1遞增計數器,線程2讀取計數器。C++中的對象的volatile關鍵字
通常,由不同線程共享的基本類型(int等)被聲明爲volatile以防止任何編譯器優化。我是否必須聲明這個線程安全的計數器對象,它由2個不同的線程共享爲易失性?
有人可以提供更多的見解嗎?
我有一個線程安全計數器對象(它是一個使用std :: atomic load()和store()) 作爲類成員之一的類。線程1遞增計數器,線程2讀取計數器。C++中的對象的volatile關鍵字
通常,由不同線程共享的基本類型(int等)被聲明爲volatile以防止任何編譯器優化。我是否必須聲明這個線程安全的計數器對象,它由2個不同的線程共享爲易失性?
有人可以提供更多的見解嗎?
看看:volatile (C++) msdn article
你不必因爲
不,如果對象被聲明爲原子,則不需要。
C或C++編譯器可能不會將讀取和寫入重新排序到易失性存儲器位置,也不會忽略對易失性存儲器位置的讀取或寫入。
通過使用atomic
,它已經實現了volatile
打算做的事情,所以不需要聲明volatile
。
你的意思是說如果對象實現原子操作就足夠了? – KodeWarrior 2013-03-12 21:31:49
@KodeWarrior是的。 – zzk 2013-03-12 21:34:02
我很懷疑。我認爲原子不保證編譯器優化的預防。 – KodeWarrior 2013-03-12 21:36:58