Zgodnie z tym https://www.cl.cam.ac.uk/~pes20/cpp/cpp0xmappings.html, zwolniony magazyn jest zaimplementowany jako MOV (do pamięci).Czy instrukcja MOV x86 implementuje magazyn atomowy C++ 11 memory_order_release?
Według jego http://en.cppreference.com/w/cpp/atomic/memory_order
memory_order_release:
Operacja sklep z tej kolejności pamięci wykonuje operację uwalniania : brak pamięci dostęp do bieżącego wątku może zostać zreorganizowane po tym sklepie. Zapewnia to, że wszystkie zapisy w bieżącym wątku są widoczne w innych wątkach, które przejmują tę samą zmienną atomową i zapisują, że przenoszą zależność do zmiennej atomowej, widocznej w innych wątkach, które pochłaniają tę samą atomową.
Rozumiem, że gdy jest stosowany memory_order_release, wszystkie sklepy pamięci wykonane wcześniej należy zakończyć przed tym.
int a;
a = 10;
std::atomic<int> b;
b.store(50, std::memory_order_release); // i can be sure that 'a' is already 10, so processor can't reorder the stores to 'a' and 'b'
PYTANIE:, jak to możliwe, że tylko instrukcja MOV jest wystarczająca dla takiego zachowania? W jaki sposób MOV mówi procesorowi, aby zakończył wszystkie poprzednie sklepy?
Zapomniałeś wspomnieć o "na x86" – Cubbi
@cubbi: prawda, to ważne, zrobione – Krab
Ponieważ jest to dynamiczny zaplanowany ISA, chip zawsze zakłada najgorszy przypadek. – user3528438