我从许多来源读到这个volatile关键字 在多线程场景中没有帮助 .但是,这个断言一直受到接受指针的原子操作函数的挑战.volatile
例如,在Mac OS X上,我们有OSAtomic函数系列:
SInt32 OSIncrementAtomic(volatile SInt32 *address);
SInt32 OSDrecrementAtomic(volatile SInt32 *address);
SInt32 OSAddAtomic(SInt32 amount, volatile SInt32 *address);
// ...
Run Code Online (Sandbox Code Playgroud)
似乎volatileWindows 上的关键字类似于Interlocked操作:
LONG __cdecl InterlockedIncrement(__inout LONG volatile *Addend);
LONG __cdecl InterlockedDecrement(__inout LONG volatile *Addend);
Run Code Online (Sandbox Code Playgroud)
似乎在C++ 11中,原子类型具有volatile修饰符的方法,它必须以某种方式表示volatile关键字与原子性有某种关系.
那么,我错过了什么?为什么操作系统供应商和标准库设计者坚持使用volatile关键字进行线程化,如果它没用?
对于这里的功能:
#include <libkern/OSAtomic.h>
Run Code Online (Sandbox Code Playgroud)
有OSAtomic和OSAtomicBarrier版本.
但是,文档未显示以下示例代码:
OSAtomic,没有OSAtomicBarrier版本OSAtomic将是不安全的,但OSAtomicBarrier将是安全的.谁能提供解释+样本代码?
[没有实际代码的"你的意见"的随机漫游是没用的.读者:请投下这样的答案; 并用实际代码充满活力地回答.]
[C/C++代码首选; 大会也好.]