Co to jest threadsafe atomic czy non atomic?

Szukałem i znalazłem immutable są bezpieczne wątek podczas mutable nie jest. W porządku. Ale mam mylące notki, blogi, odpowiedzi na temat atomic vs non-atomic na temat bezpieczeństwa wątków, uprzejmie proszę o wyjaśnienie odpowiedzi.

Załóżmy, że istnieje atomic string property o nazwie "name", i jeśli wywołasz {[0] } z wątku A, wywołasz [self setName:@"B"] z wątku B, A wywołasz [self name] z wątku C, wtedy cała operacja na innym wątku będzie wykonywana seryjnie, co oznacza, że jeśli jeden wątek jest wykonywany setter lub getter, wtedy inne wątki będą czekać. To sprawia, że właściwość "name" odczyt/zapis jest Bezpieczna, ale jeśli inny wątek d wywoła [name release] jednocześnie, operacja ta może spowodować awarię, ponieważ nie ma tu żadnego wywołania setter/getter. Co oznacza, że obiekt jest bezpieczny do odczytu/zapisu (atomowy), ale nie jest bezpieczny dla wątku, ponieważ inne wątki mogą jednocześnie wysyłać do obiektu dowolne wiadomości.

Jeśli właściwość "name" była nieatomowa, to wszystkie wątki w powyższym przykładzie-A, B, C i D będą wykonaj jednocześnie generując dowolny nieprzewidywalny wynik. W przypadku atomów, jeden z A, B lub C będzie wykonywany jako pierwszy, ale D może nadal wykonywać równolegle.

Twój komentarz na ten temat nam pomoże....

I moje pytanie brzmi: "która nić jest Bezpieczna w kakao, atomowa czy nieatomowa?"

Author: Forgot, 2012-09-10

7 answers

Dla właściwości ObjC -- ani wątek nie jest bezpieczny .

Atomic jest bardziej odporny na błędy gwintowania. Ogólnie rzecz biorąc, jest to ciekawa wartość domyślna. Scenariusze, dla których preferowałbyś atomic, są bardzo nieliczne. Atomic może zwiększyć prawdopodobieństwo poprawności, ale to na zbyt niskim poziomie można uznać za substytut WŁAŚCIWEGO mechanizmu blokującego. Dlatego, jeśli potrzebujesz bezpieczeństwa wątku, nadal potrzebujesz innej synchronizacji prymitywnej na szczycie atomowego odczytu/zapisu. Jeśli nie potrzebujesz bezpieczeństwa wątku (np. instancja jest niezmienna lub przeznaczona do uruchomienia tylko z głównego wątku), atomic nic nie doda.

Bycie odpornym na błędy wątków nie jest 'jakością' - służy do maskowania prawdziwych błędów wątków i utrudniania ich odtworzenia i wykrycia.

Zauważ również, że typy mutable vs. immutable nie gwarantują bezpieczeństwa threadsafety. "Mutable" może być używane w nazwach obiektów, aby odnosić się tylko do interfejsu -- wewnętrznych instancja niezmienna może mieć wewnętrzny, zmienny stan. Krótko mówiąc, nie można zakładać, że typ, który ma zmienną podklasę, jest bezpieczny dla wątku.


Pytanie Rozszerzone:

Załóżmy, że istnieje atomic string property o nazwie "name", i jeśli wywołasz [self setName:@"a"] z wątku A, wywołasz [self setName:@"B"] z wątku B, A wywołasz [self name] Z wątku C, wtedy cała operacja na innym wątku będzie wykonywana seryjnie, co oznacza, że jeśli jeden wątek zostanie thread wykonuje setter lub getter, wtedy inne wątki będą czekać.

Gdyby wszystkie wątki próbowały jednocześnie odczytywać i / lub zapisywać do właściwości, tylko jeden wątek miałby dostęp naraz, a pozostałe byłyby zablokowane, gdyby właściwość była atomowa. Gdyby właściwość była nieatomowa, to wszyscy mieliby niestrzeżony dostęp do odczytu i zapisu zmiennej w tym samym "czasie".

Jeśli inny wątek D wywoła jednocześnie [name release], operacja może spowoduj awarię, ponieważ nie ma tu połączenia setter/getter.

Zgadza się.

Co oznacza, że obiekt jest bezpieczny do odczytu/zapisu (atomowy), ale nie jest bezpieczny dla wątku, ponieważ inne wątki mogą jednocześnie wysyłać do obiektu dowolne wiadomości.

Jest w tym coś więcej. Częstym przykładem jest:
    @interface MONPerson : NSObject

    @property (copy) NSString * firstName;
    @property (copy) NSString * lastName;

    - (NSString *)fullName;

    @end

Atomic, lub nonatomic, będziesz potrzebował mechanizmu synchronizacji (np. lock), jeśli jeden wątek czyta z tej instancji, a drugi jest piszę do niego. Możesz skończyć z pierwszym imieniem Monpersona i ostatnim nazwiskiem innego Monpersona-obiekt mógł się zmienić przed zwróceniem wartości zwracanej przez getter, lub może się to zdarzyć:

Wątek A:

p.firstName = @"Rob";

Wątek B:

p.firstName = @"Robert";

Wątek A:

label.string = p.firstName; // << uh, oh -- will be Robert

Jeśli właściwość "name" była nieatomiczna, to wszystkie wątki w powyższym przykładzie - A,B, C i D będą wykonywane jednocześnie, dając dowolny nieprzewidywalny wynik.

Prawo-początkowe objawy mogą być nierównowaga liczby odniesienia(wyciek, nadmierne zwolnienie).

W przypadku atomów, jeden z A, B lub C będzie wykonywany jako pierwszy, ale D może nadal wykonywać równolegle. Uprzejmie skomentuj to....

Zgadza się. Ale jeśli spojrzeć na przykład powyżej -- sam atomic rzadko jest odpowiednim zamiennikiem zamka. Zamiast tego musiałoby to wyglądać tak:

Wątek A:

[p lock]; // << wait for it… … … …
// Thread B now cannot access p
p.firstName = @"Rob";
NSString fullName = p.fullName;
[p unlock];
// Thread B can now access p
label.string = fullName;

Wątek B:

[p lock]; // << wait for it… … … …
// Thread A now cannot access p
…
[p unlock];
Atomic accessors może średnio ponad dwadzieścia razy wolniej niż nonatomic dostęp. Ponadto, jeśli twoja klasa musi być bezpieczna dla wątków i mieć zmienny stan, prawdopodobnie skończysz używając blokady, gdy działa ona w scenariuszu współbieżnym. Poprawne blokowanie zapewnia wszystkie potrzebne gwarancje - Atomic accessors są redundantne w tym scenariuszu, użycie Atomic dodałoby tylko czas procesora. Inną zaletą zwykłego zamka jest to, że masz wszystkie ziarnistości, których potrzebujesz-chociaż często jest cięższy niż spin lock używany do atomiki, zazwyczaj potrzebujesz mniej nabytków tak więc kończy się bardzo szybko, jeśli prawidłowo używasz zwykłych zamków.
 62
Author: justin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-10 12:47:07

Atomic gwarantuje atomowy dostęp do zmiennej, ale nie sprawia, że Twój wątek kodu jest bezpieczny. Ani nie-atomowe.

Z "atomic", syntetyzowane metody setter/getter zapewnią, że cała wartość jest zawsze zwracana z gettera lub ustawiana przez setter, niezależnie od aktywności settera w dowolnym innym wątku. Jeśli więc wątek A znajduje się w środku gettera, podczas gdy wątek B wywołuje setter, rzeczywista realna wartość zostanie zwrócona do wywołującego w A. Dla nieatomowego, nie masz takiego Gwarancje.

 10
Author: Asciiom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-10 07:44:44

Atomic sprawia, że wykonywanie następującego wątku jest bezpieczne.

self.myProperty = value;

Lub

id value = self.myProperty

Nie sprawia, że następujący wątek jest Bezpieczny

[myPorperty addObject:value];

Atomic sprawia, że thread jest bezpieczny, aby ustawić lub uzyskać Właściwość, ale nie sprawia, że wywołanie jakichkolwiek metod tej właściwości jest bezpieczne.

Ustawienie lub pobranie wartości może zająć więcej niż jedną instrukcję procesora, a to oznacza, że ustawienie lub pobranie może zostać przerwane w połowie, a inny wątek może zrobić coś, co spowoduje postęp procesu poprzedni wątek w ustawieniu lub pobraniu nieprawidłowej wartości.

Atomic mówi set lub get the value w taki sposób, że dzieje się tak, jakby stało się to w jednej niepodzielnej instrukcji, a więc żaden inny wątek nie może przejść w połowie drogi i spieprzyć rzeczy.

Immutable object are thread safe simple because you cannot change them, of cause you can change a property from one immutable object another so that part will not be thead safe unless you make it atomic.

 7
Author: Nathan Day,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-10 11:38:17

Jest jeszcze inna właściwość "atomowa", o której nie wspomniano, która była potrzebna do zabezpieczenia wątku przed łukiem (i prawdopodobnie nadal jest). Najpierw wyjaśnij, dlaczego jest to potrzebne: powiedzmy, że bez ARC, czytasz właściwość obiektu i natychmiast ją zachowujesz. Ale inny wątek może pojawić się tylko między odczytaniem właściwości a wywołaniem zachowaj, ustaw właściwość obiektu na nil, powodując dealokację obiektu. Wysyłasz zachowanie do dealokowanego obiektu, co jest niezdrowe. I byłoby to bardzo rzadki błąd, ponieważ zdarza się tylko wtedy, gdy czas jest w sam raz. Aby temu zapobiec, właściwości obiektów atomowych zawsze zwracają obiekty z automatycznym odczytem.

 1
Author: gnasher729,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-24 10:12:04

1) oba nie są bezpieczne dla wątków. 2) Atomic jest tylko bezpieczny do odczytu i zapisu. 3) jednak jeśli chcesz, aby wątek był bezpieczny, musisz zaimplementować jakiś mechanizm blokujący do wątku, taki jak blokada mutex, blokada wirowania. Czytaj więcej ... https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html{[2]

 0
Author: Sandeep Rajbhar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-04 14:02:57

Powinieneś rozważyć wdrożenie mechanizmu blokującego, aby nie uzyskać impasu w aplikacji. Również jeśli wdrażasz podstawowe dane, powinieneś przeczytać o bezpieczeństwie wątku iOS.

Zobacz.

Http://developer.apple.com/library/iOS/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafetySummary/ThreadSafetySummary.html

Http://developer.apple.com/library/iOS/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html%23//apple_ref/doc/uid/10000057i-CH8-SW1

 -1
Author: StackRunner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-10 08:37:02

Non atomic jest bezpieczny. Guranted get wartość zmiennej.

 -7
Author: annu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-09 06:29:48