如果volatile对于线程没有用,为什么原子操作需要指向volatile数据的指针?
|
我从许多来源都读到,
volatile
关键字在多线程方案中无济于事。但是,这种断言一直受到接受“ 0”指针的原子操作函数的挑战。
例如,在Mac OS X上,我们具有OSAtomic
函数家族:
SInt32 OSIncrementAtomic(volatile SInt32 *address);
SInt32 OSDrecrementAtomic(volatile SInt32 *address);
SInt32 OSAddAtomic(SInt32 amount, volatile SInt32 *address);
// ...
似乎Windows上的ѭ5seems操作也有类似的用法a0ѭ关键字:
LONG __cdecl InterlockedIncrement(__inout LONG volatile *Addend);
LONG __cdecl InterlockedDecrement(__inout LONG volatile *Addend);
似乎在C ++ 11中,原子类型的方法带有volatile
修饰符,这一定程度上意味着volatile
关键字与原子性具有某种关系。
那么,我想念什么?如果无用的话,为什么操作系统供应商和标准库设计师坚持使用volatile
关键字进行线程化?
没有找到相关结果
已邀请:
4 个回复
渐首洽陈染
个对象。该标准允许将不合格的指针自动转换为合格的指针。标准中未提供自动进行其他操作的方法(合格的指针指向不合格的指针)(编译器通常允许这样做,但会发出警告)。 例如,如果将
原型化为:
该API仍可以实现以在内部正常工作。但是,如果用户有一个易失的对象要传递给API,则需要强制转换以防止编译器抛出警告。 既然(必要或不需要),这些API通常与
限定对象一起使用,因此将
限定符添加到指针参数可防止在使用API时生成无用的诊断,并且在将API与指向a的指针一起使用时无害。非易失性对象。
辰炔诚薯
表示不应更改指针,
则表示不应将指针缓存在寄存器中。这是一个可以自由添加的附加约束:可以将
转换为
,也可以将
转换为
。 因此,将“ 0”修饰符应用于指针对象仅可确保原子函数可用于已经存在的“ 0”变量。对于非易失性变量,添加限定符是免费的。我的错误是将原型中关键字的存在解释为使用该关键字的动机,而不是给使用它们的人员带来方便。
窝头菊
和非
变量的原子。 如果编译器内部函数使用指向
的指针,则意味着即使变量为volatile也可以使用它。它不会阻止您在非0数据上使用该功能。
览幕堤分