Z dyskusji, którą widziałem, wydaje się, że operacje atomowe i bezpieczeństwo nici są tym samym, ale wiele osób twierdzi, że są różne. Czy ktoś może mi powiedzieć różnicę, jeśli istnieje?
Z dyskusji, którą widziałem, wydaje się, że operacje atomowe i bezpieczeństwo nici są tym samym, ale wiele osób twierdzi, że są różne. Czy ktoś może mi powiedzieć różnicę, jeśli istnieje?
Odpowiedzi:
Operacje atomowe są sposobem na osiągnięcie bezpieczeństwa wątków poprzez zastosowanie pewnego rodzaju blokad, takich jak Mutexy lub Semafory, które wykorzystują operacje atomowe wewnętrznie, lub poprzez wdrożenie synchronizacji bez blokady za pomocą atomów i ogrodzeń pamięci.
Tak więc operacje atomowe na pierwotnych typach danych są narzędziem do osiągnięcia bezpieczeństwa wątku, ale nie zapewniają automatycznie bezpieczeństwa wątku, ponieważ zwykle masz wiele operacji, które są od siebie zależne. Musisz upewnić się, że operacje te są wykonywane bez zakłóceń, np. Przy użyciu Mutexes.
Tak, zapisanie jednego z tych atomowych typów danych w języku c # jest bezpieczne dla wątków, ale to nie czyni funkcji używanej w wątkach bezpiecznymi. Zapewnia to tylko prawidłowe wykonanie pojedynczego zapisu, nawet jeśli drugi wątek uzyskuje do niego dostęp „w tym samym czasie”. Niemniej jednak, następny odczyt z bieżącego wątku nie jest zapewniony, aby uzyskać wcześniej zapisaną wartość, ponieważ inny wątek mógł do niego zapisać, tyle że odczytana wartość jest poprawna.
Atomowość i bezpieczeństwo wątków to dwie różne rzeczy. Atomowość odnosi się do jakości operacji „wszystko albo nic”; jeśli operacji nie można wykonać w 100%, system powinien pozostać w ogólnym stanie, w jakim był przed rozpoczęciem jakiejkolwiek części operacji. Klasycznym przykładem jest transakcja bazy danych; Podczas zapisywania faktury, w tym jej nagłówka i wielu elementów zamówienia, każda część każdego wiersza bazy danych musi zostać pomyślnie wdrożona; jeśli nie, dane zostaną utracone lub uszkodzone. Jeśli nie można wstawić elementu zamówienia, nie tylko nie należy wstawiać innych wierszy, ale żaden z już przetworzonych wierszy nie powinien pozostać.
Bezpieczeństwo wątków odnosi się do kombinacji rzeczy, w tym atomowości, która umożliwia „ponowne wprowadzenie” operacji; wielu pracowników może wykonywać tę samą operację, rozpoczynając w tym samym lub innym czasie, bez wpływu na inne. Istnieje wiele modeli zapewniających bezpieczną obsługę wątków; większość z nich sprowadza się koncepcyjnie do albo uruchomienia wielu równoległych zadań w całkowitej izolacji (dwóch pracowników może wykonać to samo zadanie na dwóch różnych obiektach lub kolekcjach obiektów, nawet nie wiedząc, że inny pracownik w ogóle istnieje), lub utworzenia „potoku”, w ramach którego każdy z wielu pracowników wykonuje jedno zadanie z całej operacji (albo każdy pracownik przechodzi od pierwszego zadania do następnego itd.), albo koncentruje się na jednym zadaniu i przekazuje swój pośredni „produkt pracy” następnemu pracownikowi).
Operacja atomowa to operacja, której nie można przerwać.
Bezpieczny wątek to wątek, który można bezpiecznie przerwać.
Bezpieczeństwo wątków uzyskuje się za pomocą operacji atomowych, w szczególności w logice, która zapobiega wielokrotnemu dostępowi do zasobów krytycznych.
Podstawową operacją atomową jest Test-and-set , który służy do implementacji semaforów, które z kolei służą do implementacji bezpieczeństwa wątków.
Bezpieczeństwo wątków jest raczej ramą lub „koncepcją”, operacja atomowa jest podzbiorem, środkiem (jednym z wielu) do osiągnięcia statusu jako „bezpiecznym dla wątków”.
Bezpieczeństwo wątków odnosi się do procesu, do którego można uzyskać dostęp za pomocą oddzielnych wątków, w których dostęp do jednego (i manipulacja danymi) nie spowoduje uszkodzenia integralności działania drugiego.
Wiele umiejętności programisty polega na tym, jak to osiągnąć, w zależności od sytuacji i kluczowego celu, może być konieczne wdrożenie, na przykład: zamków, semaforów, zatrzasków, obiektów atomowych, reguł synchronizacji itp.