2013-03-09 9 views
7

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ć?

+2

"Synchronizuje się z" jest zdefiniowany w [intro.multithread], 1.10, akapit 8. –

+0

@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. –

+0

@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. –

Odpowiedz

6

Czy można powiedzieć, że std :: mutex :: lock nabędzie semantykę i że std :: mutex :: unlock ma zasadniczo semantykę wydania?

Tak, to jest prawidłowe.

Z tego co rozumiem zsynchronizować z nie jest jednoznacznie zdefiniowane w normie

Cóż, teoretycznie § 1.10/8 jest prawdopodobnie oznaczało dać definicję synchronizuje z:

Niektóre wywołania biblioteki synchronizują się z innymi wywołaniami biblioteki wykonywanymi przez inny wątek. Na przykład, atomowe zapasy magazynowe o numerze synchronizuje się z ładowaniem, które pobiera swoją wartość ze sklepu (29.3). [Uwaga: ...]

Z drugiej strony nie brzmi to jak bardzo formalna definicja. Jednak, lepsze, jednak domniemane jeden pośrednio podane w pkt 1,10/10:

Ocenę A zależność uporządkowane przed ocenę B, jeśli

- wykonuje operację zwalniający atomowej obiekt M, a w innym wątku B wykonuje operację zużywania na M i odczytuje wartość zapisaną przez dowolny efekt uboczny w sekwencji zwolnienia kierowanej przez A lub

- dla niektórych wartości oceny X, A jest zależna od kolejności przed X i X nosi zależności od B.

[Uwaga: Relacja "jest zależna od wcześniejszej kolejności" jest analogiczna do "synchronizuje się z", ale używa wydania/- zużywa zamiast wydania/nabycia. końcem uwaga]

Od „jest analogiczna do” związek jest najczęściej symetryczne, powiedziałbym, że powyższa definicja „jest zależność zamówić przed” pośrednio zawiera definicję " synchronizuje się z "również - chociaż możesz poprawnie zakomunikować, że notatki są nienormatywne; jednak wydaje się, że jest to zamierzona definicja.

Moja intuicja synchronizuje z związku jest to, że występuje między zapisu (atomowych) operacji wykonywanej przez jednego wątku, który przechowuje pewną wartość i pierwszy (atomowych) operacji który odczytuje tę wartość. Ta operacja może równie dobrze być w tym samym wątku.

Jeśli dwie operacje są na różnych wątkach, wówczas relacja synchronizuje się z ustanawia kolejność wątków podczas operacji.

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ę.

Dla mnie wydaje się to zgodne z powyższą interpretacją. Operacja z semantyką zwolnienia (unlock, store) zostanie zsynchronizowana z operacją nabycia semantyki (lock, load).

Jednak z mojego rozumienia semantyki nabycie/uwolnienie ma to więcej wspólnego z porządkowaniem pamięci. zsynchronizować z może również nazywać się semantyką release/acquisition?

Publikowanie i zdobywanie semantyki opisującej charakter niektórych operacji; relacja zsynchronizowana z relacją jest (w rzeczy samej) ustalona pomiędzy operacjami, które mają semantykę pozyskiwania lub uwalniania w dobrze określony sposób.

Więc w pewnym sensie synchronizuje-z jest konsekwencją semantyki tych operacji, i używamy tych semantykę osiągnąć prawidłową kolejność instrukcji i ograniczenie możliwego zamianom że CPU lub kompilator wykona.

+1

Tak więc muteks działa podobnie jak ogrodzenie, ale jedyna różnica polega na tym, że za pomocą ogrodzenia wiele wątków może nadal wykonywać kod jednocześnie, podczas gdy muteks czyni ten kod wzajemnie wykluczającym, prawda? –

+2

@TonyTheLion: Nadal uczę się tego (mniej więcej tak jak ty przypuszczam) i napisałem tę odpowiedź bez zbytniej formalnej wiedzy, aby spróbować uzupełnić twoje częściowe zrozumienie moim częściowym zrozumieniem. Jednak nie sądzę, że w tej chwili mam zrozumienie wystarczająco dobre, aby odpowiedzieć na to ostatnie pytanie –

Powiązane problemy