2010-03-19 22 views
69

從我讀到的Herb Sutterothers中,你會認爲volatile和併發編程是完全正交的概念,至少就C/C++而言。爲什麼通過std :: atomic使用volatile限定符?

但是,在GCC implementation中,所有std::atomic的成員函數都具有volatile限定符。 Anthony Williams的implementationstd::atomic也是如此。

那麼,什麼是交易,我的atomic<>變量需要volatile或不?

+0

+1先生威廉姆斯是在這裏,也許他可以出現並給出答案:) – AraK 2010-03-19 16:55:30

+1

我已經看到關於comp.std.C++的一個問題。請記住,在單個線程中讀取和寫入的volatile易失性存儲器是按順序完成的,並且volatile對象不能在其上調用任何非易失性成員函數(就像const一樣)。但除此之外,我對C++中的線程毫無頭緒。每次我嘗試在標準中閱讀它時,我開始放棄,無法掌握純文本中的間接和邏輯數量xD – 2010-03-19 17:08:14

回答

55

爲什麼在std::atomic中使用volatile限定符?

因此,揮發性物體也可以是原子的。見here

相關的報價是

的功能和操作的定義與揮發物的工作,讓變量應該是揮發性的也可以是原子。但是,揮發性限定符不是原子性所必需的。

難道我atomic<>變量必須volatile與否?

不,原子對象不必是易失性的。

+0

注意:這與技術上與平臺特定的http:// stackoverflow相同.com/questions/3708160/what-is-effect-of-interlockedincrement-argument-declared-as-volatile – Suma 2010-11-22 10:54:02

+0

volatile限定符用於防止重新排序。這就是它的作用。 – 2017-08-31 04:25:24

15

作爲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; 
}; 
75

總結別人怎麼正確書寫:

C/C++ volatile是硬件訪問和中斷。 C++ 11 atomic<>用於線程間通信(例如,在無鎖碼中)。這兩個概念/用途是正交的,但它們有重疊的要求,這就是爲什麼人們經常混淆這兩者。

atomic<>具有volatile限定功能的原因是它具有常量限定功能相同的理由,是因爲它在原理上是可能的對象既atomic<>並且還const和/或volatile

當然,如我的文章指出的那樣,混亂的另一個來源是,C/C++ volatile是不一樣的C#/爪哇volatile(後者基本上等同於C++ 11 atomic<>)。

+2

我會濫用你在這裏問你的意見關於Alexandrescu關於使用'volatile'標誌在線程不安全的代碼上產生編譯時錯誤的一篇文章(使用'volatile'實例來鎖定使用當獲得互斥體時,該接口和'const_cast'去除易失性)。在語言中添加一個類型限定詞'threadsafe'或類似的用於這個目的是否合理?(我只是想大聲)文章在這裏:http://www.drdobbs.com/cpp/184403766;jsessionid=OEWBPI10M2IQLQE1GHPCKHWATMY32JVN – 2010-03-22 10:27:58

+0

我已經添加它作爲一個問題在這裏:http://stackoverflow.com/questions/2491495 – 2010-03-22 10:55:51

+10

在一些安德烈的文章,他真的在做什麼是 劫持(呃,我的意思是「重用」)揮發性關鍵字作爲一個方便的 大部分未使用的標籤在類型系統中,他可以用作鉤子來重載和獲得其他效果,這有點令人困惑,因爲 它沒有這麼說。 – 2010-03-23 14:10:03

相關問題