2013-03-07 14 views
15

Widziałem, że istnieje this question on acquire, release, consume, etc, jednak żadna odpowiedź nie definiuje w rzeczywistości, czym właściwie jest "operacja konsumowania".Co to jest operacja konsumowania w standardzie C++ 11?

W 1,10 pkt 5 stwierdza:

Operacja synchronizacji na jednym lub większej ilości miejsc pamięci jest albo zużywają operację, operację nabywać, operację uwalniania lub zarówno nabywania i zwolnić operację.

Zastanawiam się, czy ktoś może wyjaśnić, co to jest, tak jak jest to użyte w sekcji 1.10 standardu C++ 11?

+1

Myślę, że jest to dobrze wyjaśnione w "C++ Concurrency in Action" Anthony'ego Williamsa (ale zapomniałem). –

+1

@KerrekSB Myślę, że nadszedł czas, aby zdobyć tę książkę. –

+0

@TonyTheLion: Tak, ta książka wyjaśnia to całkiem dobrze. –

Odpowiedz

9

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.