Różnica między pracą atomową a bezpieczeństwem nici?

10

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?

użytkownik960567
źródło
4
Operacje atomowe pomogą zapewnić bezpieczeństwo nici, ale jak mogą być tym samym ? „Wątek” to nie to samo, co „operacja”.
user50849,

Odpowiedzi:

11

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.

Archia
źródło
Czy int, bool, float są bezpieczne dla wątków czy atomowe?
user960567,
1
@ user960567 - typy danych są po prostu takie: typy danych. Kompilator decyduje, jak uzyskać do nich dostęp. Pomyśl o int64 na procesorze 8086.
mouviciel,
2
W języku C # to, że pytanie jest oznaczone, odczytuje i zapisuje musi być atomowe na podstawowych typach danych. Zobacz Ecma 334
user50849,
2
I tak, pisanie 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.
Arch.
4
x = 5 oznacza atom w c #. Ale natychmiast po tej operacji można ją zastąpić. x = x + 1 jest wykonywane przez 1. załadowanie x do rejestru 2. przyrost x w rejestrze 3. zapamiętanie x do pamięci. Jeśli drugi wątek robi to samo w tym samym czasie, oba załadują tę samą wartość, zwiększą ją i zapiszą, w wyniku czego x zostanie zwiększony tylko raz zamiast dwa razy. InterlockedIncrement albo używa specjalnej instrukcji procesora do wykonania przyrostu atomowego, albo zapewnia to za pomocą mechanizmu blokującego, np. CAS, aby upewnić się, że dopóki nowa wartość nie zostanie zapisana, żaden inny wątek nie może odczytać starej wartości.
Arch.
3

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

KeithS
źródło
2

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.

mouviciel
źródło
Czy nie można przerwać operacji wieloetapowej i nazwać ją atomową, jeśli gwarantuje się wycofanie zmian?
user50849,
1
Nie. Atomowy należy rozumieć w jego etymologicznym znaczeniu: ἄτομος, atomos, niepodzielny.
mouviciel
Czy int, bool, float są bezpieczne dla wątków czy atomowe?
user960567,
Ale nie istnieje różnica między będąc indivisble, a pojawiające się niepodzielne do obserwatora ? Według twojej definicji, operacja atomowa nie może zawierać więcej niż jednego kroku. Uważam, że słowo „pojawia się” w definicji operacji atomowej w Wikipedii jest ważne. (Jestem na czacie, jeśli ktoś chce to tam przywołać) :)
user50849
Jest jedna wielka różnica: bezpieczny wątek można przerwać i nie ma gwarancji, ile czasu. Ma to kluczowe znaczenie w obliczeniach w czasie rzeczywistym. Operacja atomowa (z blokadami przerwań, jeśli jest wieloetapowa) ma zostać zakończona po przewidywalnym czasie.
mouviciel
1

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.

ADP
źródło