Может ли компилятор иногда кешировать переменную, объявленную как volatile

Из того, что я знаю, компилятор никогда не оптимизирует переменную, объявленную какvolatile, Тем не менее, у меня есть массив объявлен как это.

volatile long array[8];

И разные темы читают и пишут в него. Элемент массива изменяется только одним из потоков и читается любым другим потоком. Однако в некоторых ситуациях я заметил, что даже если я изменяю элемент из потока, поток, читающий его, не замечает изменения. Он продолжает читать то же самое старое значение, как если бы компилятор где-то его кешировал. Но компилятор в принципе не должен кэшировать переменную, не так ли? Так как же это происходит?

NOTE: Я не пользуюсьvolatile для синхронизации потоков, поэтому, пожалуйста, прекратите давать мне ответы, такие как использование блокировки или атомарной переменной. Я знаю разницу между переменными, атомарными переменными и мьютексами. Также обратите внимание, что архитектура x86 имеет упреждающую согласованность кэша. Также я читаю переменную достаточно долго после того, как она предположительно изменена другим потоком. Даже по истечении длительного времени поток чтения не может видеть измененное значение.

Ответы на вопрос(10)

Ваш ответ на вопрос