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

时间:2015-06-17 13:21:02

标签: java c++ windows multithreading

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

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

volatile int i = 123;

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

注意:我正在使用Visual C ++ 2010。

1 个答案:

答案 0 :(得分:2)

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

相反,您可能最好使用std::atomic<T>(或者提升::)。它并不总是最有效的选择,但它很简单。如果这成为瓶颈,您可以放宽std::memory_order使用的std::atomic

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