c – Windows VisualC上的易读性和写入原子?

前端之家收集整理的这篇文章主要介绍了c – Windows VisualC上的易读性和写入原子?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在这个网站上有几个问题,询问是否可以使用volatile变量进行原子/多线程访问:例如,参见 here,here,or here.

现在,C()标准符合答案显然是没有的.

但是,在Windows& Visual C编译器,情况似乎不是那么清楚.

我最近answered引用了official MSDN docs的volatile

Microsoft Specific

Objects declared as volatile are (…)

  • 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.

This allows volatile objects to be used for memory locks and releases in multithreaded applications.

[emphasis mine]

现在看这个,在我看来,一个volatile变量将被MS编译器处理,因为std :: atomic将在即将到来的C11标准中.

然而,在comment to my answer,用户Hans Passant写道:“MSDN文章是非常不幸的,它是错误的,你不能实现一个挥发性的锁,甚至没有微软的版本(…)”

请注意:MSDN中给出的示例似乎很有腥味,因为您通常不会实现无原子交换的锁定. (也是pointed out by Alex.)这仍然是问题wrt.对MSDN文章中给出的其他信息的有效性,特别是对于herehere的用例.)

另外,有Interlocked *函数的文档,特别是InterlockedExchange,它具有一个volatile(!?)变量,并进行原子读写. (请注意,我们对SO-When should InterlockedExchange be used?有一个问题 – 不会授权回答此功能是否需要只读或只写原子访问.)

更重要的是,上面引用的易失性文档以“全球或静态对象”的形式引用,我认为“真实”acquire/release semantics应该适用于所有价值观.

回到问题

在Windows上,使用Visual C(2005 – 2010年),将声明一个(32位?int?)变量作为volatile允许原子读取和写入此变量?

对我来说特别重要的是,这应该保持(或不)在Windows / VC上独立于程序运行的处理器或平台. (就是说,它是WinXP / 32bit还是Windows 2008R2 / 64bit运行在Itanum2上?)

请用可验证的信息,链接,测试用例来备份您的答案!

解决方法

是的,它们在windows / vc上是原子的(假设你符合对齐要求等等)

但是对于一个锁,你需要一个原子测试和设置,或比较和交换机制或类似的,而不仅仅是一个原子更新或阅读.

否则,无法测试锁并在一个不可分割的操作中声称它.

编辑:如下所述,32位或以下的x86上的所有对齐的内存访问都是原子的.关键是易失性使内存访问有序. (感谢您在评论中指出这一点)

猜你在找的C&C++相关文章