從我讀到的Herb Sutter和others中,你會認爲volatile
和併發編程是完全正交的概念,至少就C/C++而言。爲什麼通過std :: atomic使用volatile限定符?
但是,在GCC implementation中,所有std::atomic
的成員函數都具有volatile
限定符。 Anthony Williams的implementation的std::atomic
也是如此。
那麼,什麼是交易,我的atomic<>
變量需要volatile
或不?
從我讀到的Herb Sutter和others中,你會認爲volatile
和併發編程是完全正交的概念,至少就C/C++而言。爲什麼通過std :: atomic使用volatile限定符?
但是,在GCC implementation中,所有std::atomic
的成員函數都具有volatile
限定符。 Anthony Williams的implementation的std::atomic
也是如此。
那麼,什麼是交易,我的atomic<>
變量需要volatile
或不?
爲什麼在std::atomic
中使用volatile
限定符?
因此,揮發性物體也可以是原子的。見here:
相關的報價是
的功能和操作的定義與揮發物的工作,讓變量應該是揮發性的也可以是原子。但是,揮發性限定符不是原子性所必需的。
難道我atomic<>
變量必須volatile
與否?
不,原子對象不必是易失性的。
注意:這與技術上與平臺特定的http:// stackoverflow相同.com/questions/3708160/what-is-effect-of-interlockedincrement-argument-declared-as-volatile – Suma 2010-11-22 10:54:02
volatile限定符用於防止重新排序。這就是它的作用。 – 2017-08-31 04:25:24
作爲const,volatile是可傳遞的。如果你聲明一個方法爲volatile
,那麼你不能調用它的任何非易失性方法或其任何成員屬性。通過使用std::atomic
方法volatile
,您允許在包含std::atomic
變量的類中從volatile
成員方法調用。
我沒有好日子......如此混亂...也許一個小例子幫助:
struct element {
void op1() volatile;
void op2();
};
struct container {
void foo() volatile {
e.op1(); // correct
//e.op2(); // compile time error
}
element e;
};
總結別人怎麼正確書寫:
C/C++ volatile
是硬件訪問和中斷。 C++ 11 atomic<>
用於線程間通信(例如,在無鎖碼中)。這兩個概念/用途是正交的,但它們有重疊的要求,這就是爲什麼人們經常混淆這兩者。
該atomic<>
具有volatile限定功能的原因是它具有常量限定功能相同的理由,是因爲它在原理上是可能的對象既atomic<>
並且還const
和/或volatile
。
當然,如我的文章指出的那樣,混亂的另一個來源是,C/C++ volatile
是不一樣的C#/爪哇volatile
(後者基本上等同於C++ 11 atomic<>
)。
我會濫用你在這裏問你的意見關於Alexandrescu關於使用'volatile'標誌在線程不安全的代碼上產生編譯時錯誤的一篇文章(使用'volatile'實例來鎖定使用當獲得互斥體時,該接口和'const_cast'去除易失性)。在語言中添加一個類型限定詞'threadsafe'或類似的用於這個目的是否合理?(我只是想大聲)文章在這裏:http://www.drdobbs.com/cpp/184403766;jsessionid=OEWBPI10M2IQLQE1GHPCKHWATMY32JVN – 2010-03-22 10:27:58
我已經添加它作爲一個問題在這裏:http://stackoverflow.com/questions/2491495 – 2010-03-22 10:55:51
在一些安德烈的文章,他真的在做什麼是 劫持(呃,我的意思是「重用」)揮發性關鍵字作爲一個方便的 大部分未使用的標籤在類型系統中,他可以用作鉤子來重載和獲得其他效果,這有點令人困惑,因爲 它沒有這麼說。 – 2010-03-23 14:10:03
+1先生威廉姆斯是在這裏,也許他可以出現並給出答案:) – AraK 2010-03-19 16:55:30
我已經看到關於comp.std.C++的一個問題。請記住,在單個線程中讀取和寫入的volatile易失性存儲器是按順序完成的,並且volatile對象不能在其上調用任何非易失性成員函數(就像const一樣)。但除此之外,我對C++中的線程毫無頭緒。每次我嘗試在標準中閱讀它時,我開始放棄,無法掌握純文本中的間接和邏輯數量xD – 2010-03-19 17:08:14