gpt4 book ai didi

c++ - 何时在多线程中使用 volatile ?

转载 作者:行者123 更新时间:2023-11-30 16:31:26 29 4
gpt4 key购买 nike

如果有两个线程访问全局变量,那么许多教程都说使变量具有 volatile ,以防止编译器将变量缓存在寄存器中,从而无法正确更新。然而,两个线程都访问共享变量需要通过互斥体进行保护,不是吗?但在这种情况下,在线程锁定和释放互斥体之间,代码位于临界区,只有一个线程可以访问该变量,在这种情况下,该变量不需要是 volatile 的?

那么,在多线程程序中, volatile 的用途/目的是什么?

最佳答案

简短快速的回答: volatile 对于平台无关的多线程应用程序编程来说(几乎)没有用处。它不提供任何同步,不创建内存栅栏,也不确保操作的执行顺序。它不会使操作原子化。它不会神奇地使您的代码线程安全。 volatile 可能是所有 C++ 中最容易被误解的工具。请参阅this , thisthis有关 volatile 的更多信息

另一方面, volatile 确实有一些可能不那么明显的用途。它的使用方式与使用 const 的方式大致相同,可以帮助编译器向您显示以非保护方式访问某些共享资源时可能会犯错误的位置。 Alexandrescu 在 this article 中讨论了这种用法。 。然而,这基本上是在使用 C++ 类型系统,这种方式通常被视为一种发明,并且可能引发未定义的行为。

volatile 专门用于与内存映射硬件、信号处理程序和 setjmp 机器代码指令交互时使用。这使得 volatile 直接适用于系统级编程,而不是普通的应用程序级编程。

2003 C++ 标准并未规定 volatile 对变量应用任何类型的获取或释放语义。事实上,该标准对多线程的所有问题都完全保持沉默。但是,特定平台确实会对 volatile 变量应用获取和释放语义。

[C++11 更新]

C++11 标准现在确实直接在内存模型和语言中承认多线程,并且它提供了库工具以独立于平台的方式处理它。然而, volatile 的语义仍然没有改变。 volatile 仍然不是同步机制。 Bjarne Stroustrup 在 TCPPPL4E 中也说了同样的话:

Do not use volatile except in low-level code that deals directlywith hardware.

Do not assume volatile has special meaning in the memory model. Itdoes not. It is not -- as in some later languages -- asynchronization mechanism. To get synchronization, use atomic, amutex, or a condition_variable.

[/结束更新]

以上内容均适用于 C++ 语言本身,如 2003 年标准(现在是 2011 年标准)所定义。然而,某些特定平台确实添加了额外的功能或对 volatile 的功能进行限制。例如,在 MSVC 2010(至少)中,获取和释放语义确实适用于对 volatile 变量的某些操作。 From the MSDN :

When optimizing, the compiler must maintain ordering among referencesto volatile objects as well as references to other global objects. Inparticular,

A write to a volatile object (volatile write) has Release semantics; areference to a global or static object that occurs before a write to avolatile object in the instruction sequence will occur before thatvolatile write in the compiled binary.

A read of a volatile object (volatile read) has Acquire semantics; areference to a global or static object that occurs after a read ofvolatile memory in the instruction sequence will occur after thatvolatile read in the compiled binary.

但是,您可能会注意到这样一个事实:如果您点击上面的链接,评论中就会出现一些关于获取/释放语义是否实际上适用于这种情况的争论。

关于c++ - 何时在多线程中使用 volatile ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50601122/

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