在这个网站上有几个问题,询问是否可以使用volatile变量进行原子/多线程访问:例如,参见
here,here,or here.
@H_502_2@现在,C()标准符合答案显然是没有的.
@H_502_2@但是,在Windows& Visual C编译器,情况似乎不是那么清楚.
@H_502_2@我最近answered引用了official MSDN docs的volatile
@H_502_2@现在看这个,在我看来,一个volatile变量将被MS编译器处理,因为std :: atomic将在即将到来的C11标准中. @H_502_2@然而,在comment to my answer,用户Hans Passant写道:“MSDN文章是非常不幸的,它是错误的,你不能实现一个挥发性的锁,甚至没有微软的版本(…)” @H_502_2@请注意:MSDN中给出的示例似乎很有腥味,因为您通常不会实现无原子交换的锁定. (也是pointed out by Alex.)这仍然是问题wrt.对MSDN文章中给出的其他信息的有效性,特别是对于here和here的用例.) @H_502_2@另外,有Interlocked *函数的文档,特别是Microsoft Specific
@H_502_2@Objects declared as volatile are (…)@H_502_2@This allows volatile objects to be used for memory locks and releases in multithreaded applications. @H_502_2@[emphasis mine]
- A write to a volatile object (volatile write) has Release semantics;
a reference to a global or static object? that occurs before a write to
a volatile object in the instruction sequence will occur before that
volatile write in the compiled binary.- A read of a volatile object (volatile read) has Acquire semantics; a reference to a
global or static object? that occurs after a read of volatile memory in the
instruction
sequence will occur after that volatile read in the compiled binary.
InterlockedExchange
,它具有一个volatile(!?)变量,并进行原子读写. (请注意,我们对SO-When should InterlockedExchange be used?有一个问题 – 不会授权回答此功能是否需要只读或只写原子访问.)
@H_502_2@更重要的是,上面引用的易失性文档以“全球或静态对象”的形式引用,我认为“真实”acquire/release semantics应该适用于所有价值观.
@H_502_2@回到问题
@H_502_2@在Windows上,使用Visual C(2005 – 2010年),将声明一个(32位?int?)变量作为volatile允许原子读取和写入此变量?
@H_502_2@对我来说特别重要的是,这应该保持(或不)在Windows / VC上独立于程序运行的处理器或平台. (就是说,它是WinXP / 32bit还是Windows 2008R2 / 64bit运行在Itanum2上?)
@H_502_2@请用可验证的信息,链接,测试用例来备份您的答案!