Мы используем, например, барьер памяти StoreLoad, а в x86 lock addl $0x0,(%rsp) ;
представляет барьер памяти StoreLoad.Как мы знаем, Store1;StoreLoad;Load2
гарантирует, что данные Store1 сбрасываются в основную память до того, как Load2
Один поток выполняет процедуру Store1, псевдокод выглядит следующим образом:
write to local copy of variable A
lock addl $0x0,(%rsp)
Другой поток выполняет процедуру Load2,псевдокод выглядит следующим образом:
load variable A
Может ли окончательный порядок выполнения быть следующим?
write to local copy of variable A
load variable A
lock addl $0x0,(%rsp)
Если это так, похоже, нарушена семантика барьера памяти
Большое спасибо