Podobno po pewnym wyszukiwaniu "operacja konsumpcji" jest operacją pamięci, w której wartość odczytana z pamięci jest używana po załadowaniu w kilku operacjach i tworzy zależność danych.
Możliwość zamawiania operacji bez wprowadzania jawnych ogrodzeń pamięciowych jest tym, co jest widoczne (z mojego zrozumienia) na poziomie memory_order_consume
.
Z memory_order_consume
, kompilator i CPU są wymagane zamówić danego ładunku przed tylko tych kolejnych obciążeń i sklepach, których adresy lub wartości są obliczane na podstawie wartości obciążonej. source
Później w tym tekście jest napisane:
/*Example code elided */
Kluczową kwestią jest to, że atomic_load_explicit()
użyciu memory_order_consume
gwarancji, że późniejsze dostępy będzie widać żadnej inicjalizacji prowadzone przez insert_foo()
, nawet jeśli są one wykonywanie jednocześnie i bez napowietrznych instrukcji jawnego ogrodzenia pamięci. W przeciwieństwie, memory_order_acquire
wymagałoby wyraźnych barier pamięciowych w słabo uporządkowanych systemach i nadmiernie ograniczało optymalizacje kompilacji na wszystkich systemach.
C++ 11 standardowy projekt n3485 określa memory_order_consume
jako:
29,3 porządku i konsystencji [atomics.order]
memory_order_consume: operację obciążenia wykonuje operację zużywają dotkniętych lokalizacja pamięci.
Więc z mojego zrozumienia jest to, aby zamówić obciążenia pamięci tak, że kolejne ładunki i sklepy wykorzystujące że obciążenia są rzeczywiście późniejszego. Innymi słowy, obciążenie jest zużyte.
Myślę, że jest to dobrze wyjaśnione w "C++ Concurrency in Action" Anthony'ego Williamsa (ale zapomniałem). –
@KerrekSB Myślę, że nadszedł czas, aby zdobyć tę książkę. –
@TonyTheLion: Tak, ta książka wyjaśnia to całkiem dobrze. –