据我所知,编译器从不优化声明为volatile
的变量。但是,我有一个声明如下的数组。
volatile long array[8];
有不同的线程读取和写入这个数组。数组的一个元素只会被一个线程修改,而可以被任何其他线程读取。但是,在某些情况下,我注意到即使我从一个线程中修改了一个元素,读取它的线程也没有注意到更改。它仍然继续读取相同的旧值,好像编译器已经把它缓存到某个地方了。但是,编译器原则上不应该缓存一个volatile
变量,对吗?那么为什么会发生这种情况呢?
注意:我不是使用volatile
进行线程同步,请不要给我提供使用锁或原子变量等答案。我知道volatile、原子变量和互斥锁之间的区别。还要注意的是,架构是具有主动缓存一致性的x86。而且在另一个线程修改变量后,我已经长时间读取过这个变量。即使经过很长时间后,读取线程仍然看不到修改后的值。
volatile
只影响编译器优化,而不影响可能发生的CPU重排序。 - Tudorvolatile
进行线程同步,但如果你期望它在不同线程中引入读写关系,那么实际上你确实在进行线程同步,因为根据定义,这就是线程同步的作用。 - Steve Jessop