Czytam C model pamięci ++ zdefiniowane w n3485 i mówi o uwolnienie/nabycia semantyki, które z tego co rozumiem, a także z definicjami given in this blog:Release/Zdobyć semantyka std wrt :: mutex
Pozyskiwanie semantyki jest właściwością, która może mieć zastosowanie tylko do operacji, które odczytać z pamięci dzielonej, niezależnie od tego, czy są to operacje odczytu-modyfikacji-zapisu, czy zwykłe obciążenia. Operacja jest następnie uważana za odczyt-nabycie. Nabycie semantyki zapobiega zmianie kolejności pamięci odczytu-odczytu z każdą operacją odczytu lub zapisu, która następuje po niej w porządku programu.
semantyka wydaniu jest właściwością, która może mieć zastosowanie tylko do operacji, które piszą do pamięci dzielonej, czy są one modyfikować odczytu i zapisu operacji lub zwykły sklepów. Operacja jest następnie uznawana za wersję do zapisu. Zwolnij semantykę zapobiega zmianie kolejności pamięci dla zapisu-wydania z dowolną operacją odczytu lub zapisu, która poprzedza ją w porządku programu.
będzie zapobiegać zmianom kolejności odczytywanych/zapisywanych przed lub po zakończeniu bieżącego odczytu/zapisu. Pierwszy (nabycie) upewni się, że aktualnie wykonywany odczyt nie zostanie zmieniony z jakimkolwiek następnym odczytem/zapisem, drugie (wydanie) upewni się, że bieżący zapis nie zostanie ponownie zamieniony z operacjami odczytu/zapisu, które pojawią się wcześniej to.
Teraz można powiedzieć, że będzie miał std::mutex::lock
nabyć semantykę i że std::mutex::unlock
zasadniczo ma uwalnianie semantyka?
W standardzie mogę znaleźć tego w sekcji
30.4.1.2 rodzajów mutex [thread.mutex.requirements.mutex]
11 Synchronizacja: Prior
unlock()
operacje na tym samym obiekcie powinna zsynchronizować z (1.10) tę operację.
Z tego co rozumiem Synchronizacja z nie jest jednoznacznie zdefiniowane w standardzie, jednak wydaje się być rodzajem dzieje przed stosunku patrząc na dwóch stwierdzeń ocenianych dwóch różnych wątków, jednak z mojego zrozumienie semantyki nabycia/zwolnienia, ma to więcej wspólnego z porządkowaniem pamięci. zsynchronizować z można również nazwać release/acquire semantyki?
Czy semantyka wydania/pozyskiwania stosuje się nie tylko do zmiany kolejności operacji ładowania/składowania, a także do przeplatania wewnątrz wątków operacji?
W standardowej sekcji o modelu pamięci najczęściej mówi się o uporządkowanych relacjach w kategoriach dwóch wątków przeplotu. To pozostawia otwartą interpretację, czy dotyczy to również porządkowania pamięci.
Czy ktoś może wyjaśnić?
"Synchronizuje się z" jest zdefiniowany w [intro.multithread], 1.10, akapit 8. –
@PeteBecker: Prawda, ale to, co tam jest napisane, nie brzmi tak jak "definicja": "* Niektóre połączenia z biblioteką synchronizują się z innymi wywołania biblioteki wykonywane przez inny wątek, na przykład: atomowe zapamiętywanie magazynu synchronizuje się z ładowaniem, które ma swoją wartość ze sklepu (29.3). * "Słowa takie jak" pewny "i" na przykład "nie są zbyt formalne. –
@AndyProwl - masz rację, to jest trochę rozmyte. Nie ze względu na "pewny", który jest krótkim sposobem powiedzenia "niektóre, ale nie wszystkie", ale dlatego, że nie mówi dokładnie, co to oznacza. Gdy wymagania biblioteki mówią, że operacja "synchronizuje się z" inną operacją, która wprowadza porządek, który staje się częścią relacji "między wątkami dzieje się przed". Nie ma więc jednego miejsca, które formalnie definiuje "synchronizuje się z". Jest to definicja rozproszona: wszędzie tam, gdzie mówi specyfikacja biblioteki, dzieje się tak. –