Может ли компилятор иногда кешировать переменную, объявленную как volatile
Из того, что я знаю, компилятор никогда не оптимизирует переменную, объявленную какvolatile
, Тем не менее, у меня есть массив объявлен как это.
volatile long array[8];
И разные темы читают и пишут в него. Элемент массива изменяется только одним из потоков и читается любым другим потоком. Однако в некоторых ситуациях я заметил, что даже если я изменяю элемент из потока, поток, читающий его, не замечает изменения. Он продолжает читать то же самое старое значение, как если бы компилятор где-то его кешировал. Но компилятор в принципе не должен кэшировать переменную, не так ли? Так как же это происходит?
NOTE: Я не пользуюсьvolatile
для синхронизации потоков, поэтому, пожалуйста, прекратите давать мне ответы, такие как использование блокировки или атомарной переменной. Я знаю разницу между переменными, атомарными переменными и мьютексами. Также обратите внимание, что архитектура x86 имеет упреждающую согласованность кэша. Также я читаю переменную достаточно долго после того, как она предположительно изменена другим потоком. Даже по истечении длительного времени поток чтения не может видеть измененное значение.