Согласно Википедии: Барьер памяти, также известный как инструкция membar, memory guard или filter, представляет собой тип барьерной инструкции, которая заставляет центральный процессор (ЦП) или компилятор применять ограничение порядка операций с памятью, выполняемых до и после барьерная инструкция. Обычно это означает, что операции, выполненные до барьера, гарантированно будут выполнены до операций, запущенных после барьера.
Обычно статьи говорят о чем-то вроде (я буду использовать мониторы вместо мембаров):
class ReadWriteExample {
int A = 0;
int Another = 0;
//thread1 runs this method
void writer () {
lock monitor1; //a new value will be stored
A = 10; //stores 10 to memory location A
unlock monitor1; //a new value is ready for reader to read
Another = 20; //@see my question
}
//thread2 runs this method
void reader () {
lock monitor1; //a new value will be read
assert A == 10; //loads from memory location A
print Another //@see my question
unlock monitor1;//a new value was just read
}
}
Но мне интересно, возможно ли, что компилятор или процессор перемешают вещи таким образом, что код напечатает 20? Мне не нужна гарантия.
т.е. по определению операции, выполненные до барьера, не могут быть протолкнуты компилятором, но возможно ли, что операции, запущенные после барьера, иногда будут видны перед барьером? (просто вероятность)
Спасибо
volatile
, который можно использовать для переменных, которые могут быть получены из нескольких потоков. Но, в конечном счете, ОС должна передать обработку потоков ЦП, и этот порядок может зависеть от многих вещей. - person jwatts1980   schedule 08.04.201520
может быть записано, а эффекты полностью распространены еще до того, какreader
будет вызван. - person Cameron   schedule 08.04.2015