我一直在閱讀許多來源,the volatile
keywordis not helpfulin multithreaded scenarios。但是,這種說法經常受到接受指針的原子操作函數的挑戰。如果volatile對於線程無用,爲什麼原子操作需要指向volatile數據的指針?
例如,在Mac OS X,我們有OSAtomic
函數族:
SInt32 OSIncrementAtomic(volatile SInt32 *address);
SInt32 OSDrecrementAtomic(volatile SInt32 *address);
SInt32 OSAddAtomic(SInt32 amount, volatile SInt32 *address);
// ...
它似乎有在Windows上volatile
關鍵字爲Interlocked
操作類似的用法:
LONG __cdecl InterlockedIncrement(__inout LONG volatile *Addend);
LONG __cdecl InterlockedDecrement(__inout LONG volatile *Addend);
似乎在C++ 11中,原子類型具有volatile
修飾符的方法,這必須以某種方式表示volatile
關鍵字與atomicit具有某種關係年。
那麼,我錯過了什麼?爲什麼操作系統供應商和標準庫設計者堅持使用volatile
關鍵字作爲線程目的,如果它沒有用的話?
這並不是揮發性沒有用,更多的是揮發性數據不能保證原子操作 –
不是一個愚蠢的,但與http://stackoverflow.com/questions/2479067/why-is-the-volatile- qualifier-used-through-out-stdatomic –