gpt4 book ai didi

c++ - Windows+VisualC 上的 volatile 读写是原子的吗?

转载 作者:可可西里 更新时间:2023-11-01 15:55:56 27 4
gpt4 key购买 nike

此站点上有几个问题询问是否可以使用 volatile 变量进行原子/多线程访问:参见 here , here , or here例如。

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

但是,在 Windows 和 Visual C++ 编译器上,情况似乎不太清楚。

我最近answered并引用了official MSDN docsvolatile

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]

现在,读到这里,在我看来,MS 编译器会将 volatile 变量视为即将到来的 C++11 标准中的 std::atomic

但是,在 comment to my answer , 用户 Hans Passant写道 “那篇 MSDN 文章非常不幸,它大错特错。你不能用 volatile 实现锁,即使是 Microsoft 的版本也不行。(...)”


请注意:MSDN 中给出的示例 似乎很可疑,因为您通常无法在没有原子交换 的情况下实现锁。 (还有 pointed out by Alex 。)这仍然留下了问题。此 MSDN 文章中给出的其他信息的有效性,特别是对于 here 这样的用例和 here .)


此外,还有 Interlocked* 函数的文档,尤其是 InterlockedExchange with需要一个volatile(!?)变量并进行原子读+写。 (请注意,我们在 SO 上提出的一个问题 -- When should InterlockedExchange be used? -- 没有权威地回答只读或只写原子访问是否需要此函数。)

此外,上面引用的 volatile 文档以某种方式暗示了“全局或静态对象”,我认为这是“真实的”acquire/release semantics应适用于所有值。

回到问题

在 Windows 上,使用 Visual C++ (2005 - 2010),将(32 位?int?)变量声明为 volatile 是否允许对该变量进行原子读写?

对我来说特别重要的是,这应该适用于(或不适用)Windows/VC++ 独立程序运行的处理器或平台。 (也就是说,Itanum2 上运行的是 WinXP/32bit 还是 Windows 2008R2/64bit 有关系吗?)

请使用可验证的信息、链接、测试用例来支持您的回答!

最佳答案

是的,它们在 windows/vc++ 上是原子的(假设您满足对齐要求等或类(class))

但是,对于锁,您需要进行原子测试和设置,或者比较和交换指令或类似操作,而不仅仅是原子更新或读取。

否则无法在一个不可分割的操作中测试锁声明它。

编辑:正如下面评论的那样,32 位或以下的 x86 上的所有对齐内存访问无论如何都是原子的。关键是 volatile 使内存访问有序。 (感谢您在评论中指出这一点)

关于c++ - Windows+VisualC 上的 volatile 读写是原子的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7007403/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com