c ++ volatile多线程变量

ano*_*non 6 c++ volatile

我正在写一个C++应用程序.

我有一个多个线程正在写入的类变量.

在C++中,任何可以在没有编译器"意识到"它被更改的情况下进行修改的东西都需要标记为volatile吗?因此,如果我的代码是多线程的,并且一个线程可以写入var而另一个线程从中读取,我是否需要标记var volaltile?

[我没有竞争条件,因为我依赖于对原子的写入]

谢谢!

APr*_*mer 13

C++还没有任何多线程的规定.在实践中,volatile不能达到你的意思(它是专为内存加入的硬件而设计的,虽然两个问题相似但它们不同,volatile不能做正确的事情 - 请注意,volatile已用于其他mt语境中的用法语言).

因此,如果您想在一个线程中编写一个对象并在另一个线程中读取它,则必须在需要时使用实现所需的同步功能.对于我所知道的那个,挥发性没有发挥作用.

仅供参考,下一个标准将考虑到MT,而挥发性将不起作用.所以这不会改变.您将只具有需要同步的标准定义条件以及实现它们的标准定义方式.


Han*_*ant 5

是的,挥发性是您所需要的绝对最低限度。它确保代码生成器不会生成将变量存储在寄存器中的代码,并且始终执行对内存的读取和写入。大多数代码生成器可以为与本机 CPU 字大小相同的变量提供原子性保证,它们将确保内存地址对齐,以便变量不能跨越缓存行边界。

然而,对于现代多核 CPU 来说,这并不是一个非常强有力的契约。Volatile 不保证在另一个核心上运行的另一个线程可以看到变量的更新。这需要内存屏障,通常是刷新 CPU 缓存的指令。如果不提供屏障,线程实际上将继续运行,直到自然发生这种刷新。这最终会发生,线程调度程序必然会提供一个。这可能需要几毫秒。

一旦处理完这样的细节,您最终将重新发明一个条件变量(也称为事件),它不可能比线程库提供的条件变量更快。或者也经过测试。不要发明你自己的,线程很难做到正确,你不需要担心不确定最基本的原语是否可靠。

  • 挥发性并不是绝对最低的。它远低于最低值。最小值还必须防止共享变量周围的读/写重新排序。 (2认同)

Fra*_*vin 3

易失性指示编译器不要根据变量值或用法的“直觉”进行优化,因为它可以“从外部”进行优化。

然而 volatile 不会提供任何同步,并且您对 int 的写入是原子的假设几乎是现实的!

我想我们需要查看一些用法来了解您的情况是否需要 volatile (或检查程序的行为)或更重要的是您是否看到某种同步。