Допустим, у меня есть два потока, которые совместно используют глобальную переменную x
. Задача Thread A
— установить значение x
, а задача Thread B
— прочитать x
. Теперь каждый поток (или, я полагаю, каждое ядро) будет иметь кэшированную копию x
.
Предположим, что Thread A
установил значение x
в 12345
. Теперь кеш Thread A
может оставаться неизменным, потому что ЦП может запланировать выполнение операции set позже, и поэтому протокол когерентности кеша не будет действовать, и поэтому, когда Thread B
считывает значение x
, он будет считывать старое значение.
Мой вопрос: есть ли что-нибудь, что мешает процессору долго ждать (например: 10 минут) перед выполнением запланированных операций набора?
Примечание. Я знаю, что могу использовать барьер памяти, чтобы заставить ЦП немедленно выполнять запланированные операции набора, но мне любопытно узнать, что может произойти, если я не использую память барьер.
volatile
для этой переменной (x
), чтобы она не кэшировала значение ни в потоке A, ни в B - person ntshetty   schedule 15.03.2017