在Java中,有时当从不同的线程访问同一个变量时,每个线程都会创建自己的变量副本,所以如果我将一个线程中的变量值设置为10
然后我试过要从另一个线程读取此变量的值,我将不会得到10
(因为第二个线程正在读取变量的另一个副本!)。
要在Java中解决此问题,我所要做的就是使用关键字volatile,例如:
volatile int i = 123;
C ++中是否也存在此问题?如果是这样,我该如何解决?
注意:我正在使用Visual C ++ 2010。
答案 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)