【发布时间】:2012-09-24 11:45:21
【问题描述】:
据我所知,编译器从不优化声明为volatile 的变量。但是,我有一个这样声明的数组。
volatile long array[8];
不同的线程对其进行读写。数组的元素仅由其中一个线程修改并由任何其他线程读取。但是,在某些情况下,我注意到即使我从线程修改元素,读取它的线程也不会注意到更改。它继续读取相同的旧值,就好像编译器已将其缓存在某个地方一样。但是编译器原则上不应该缓存 volatile 变量,对吗?那怎么会这样呢。
注意:我没有使用volatile 进行线程同步,所以请不要再给我答案,例如使用锁或原子变量。我知道易失性、原子变量和互斥体之间的区别。另请注意,该架构是具有主动缓存一致性的 x86。此外,在它被另一个线程修改后,我读了足够长的时间。即使过了很长时间,读取线程也看不到修改后的值。
【问题讨论】:
-
volatile 不适用于线程。您需要使用互斥锁。
-
C++
volatile中的 AFAIK 仅影响编译器优化,不会影响仍然可能发生的 CPU 重新排序。 -
你的笔记不会影响我的答案,顺便说一句,可能不会影响其他人的答案。您可能不会认为您使用
volatile进行线程同步,但如果您希望它在不同线程中引入读取和写入之间的关系,那么事实上您是,因为根据定义,这就是线程同步 是. -
@Eric:它明确说明了读者何时会看到更新的期望:“我在被另一个线程修改后读取了足够长的变量”。假设测试代码正在执行它的预期,这是 user1018562 和他的实现之间的争论,关于“足够长”的时间。他说有一个限制,实施显然说没有。该标准不会干预该论点,它没有说明编译器是否“原则上不应该缓存 volatile 变量”,因为代码存在数据竞争。
-
我会尝试互斥锁。如果这样可以解决它,那么您可以预期这是一个缓存问题。如果这不能解决问题,那么您可以在其他地方寻找问题。
标签: c++ c multithreading x86 volatile