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

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

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

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

Microsoft Specific

@H_502_2@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.
@H_502_2@This allows volatile objects to be used for memory locks and releases in multithreaded applications.

@H_502_2@[emphasis mine]

@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文章中给出的其他信息的有效性,特别是对于herehere的用例.)

@H_502_2@另外,有Interlocked *函数的文档,特别是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@请用可验证的信息,链接,测试用例来备份您的答案!

解决方法

是的,它们在windows / vc上是原子的(假设你符合对齐要求等等) @H_502_2@但是对于一个锁,你需要一个原子测试和设置,或比较和交换机制或类似的,而不仅仅是一个原子更新或阅读.

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

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

原文链接:https://www.f2er.com/c/114715.html

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