在 C++ 中是否有 Java 'volatile' 的等价物?

pau*_*aul 6 c++ java windows multithreading

在 Java 中,有时从不同线程访问相同变量时,每个线程都会创建自己的变量副本,因此如果我将一个线程中的变量值设置为10,然后我尝试从另一个线程,我不会得到10(因为第二个线程正在从变量的另一个副本中读取!)。

为了在 Java 中解决这个问题,我所要做的就是使用关键字 volatile,例如:

volatile int i = 123;
Run Code Online (Sandbox Code Playgroud)

C++中是否也存在这个问题?如果是这样,我该如何解决?

注意:我使用的是 Visual C++ 2010。

MSa*_*ers 5

是的,C++ 中也存在同样的问题。但是由于 C 已经引入了volatile具有不同含义的关键字(与线程无关),并且 C++ 以相同的方式使用了它们的关键字,因此您不能volatile像在 Java 中那样在 C++ 中使用。

相反,您最好使用std::atomic<T>(或 boost::)。它并不总是最有效的替代方法,但它很简单。如果结果证明这是一个瓶颈,您可以放宽std::memory_orderused by std::atomic

话虽如此,关于标准 C++,MSVC++ 作为扩展确实保证了多个线程可以访问一个共享volatile变量。IIRC,所有线程最终都会看到相同的值,并且没有线程会及时返回。(也就是说,如果将 0 和 1 依次写入一个变量,则没有线程会看到序列 1,0)