Wykorzystanie właściwości atomowych w Objective C: jakieś skutki uboczne?

Rozumiem, że znaczenie atomic zostało wyjaśnione w Jaka jest różnica między atrybutami atomowymi i nieatomowymi?, ale chcę wiedzieć:

P. czy poza problemami z wydajnością wszędzie można zauważyć jakieś skutki uboczne w korzystaniu z właściwości atomowych?

Wydaje się, że odpowiedź brzmi nie, ponieważ wydajność iPhone ' a jest obecnie dość szybka. Dlaczego więc tak wiele osób wciąż używa non-atomic?

Nawet atomic nie gwarantuje bezpieczeństwa wątku, ale i tak lepsze to niż nic, prawda?

Author: Community, 2012-08-17

2 answers

Nawet atomic nie gwarantuje bezpieczeństwa nici, ale to i tak lepsze niż nic, prawda?

Wrong . Po napisaniu kilku naprawdę skomplikowanych programów współbieżnych, polecam dokładnie odwrotnie. Powinieneś zarezerwować atomic Na czas, kiedy naprawdę ma to sens-i możesz nie w pełni to zrozumieć, dopóki nie napiszesz współbieżnych programów bez użycia atomic. Jeśli piszę program wielowątkowy, nie chcę maskować błędów programistycznych (np. race warunki). chcę, aby kwestie współbieżności były głośne i oczywiste.W ten sposób łatwiej je zidentyfikować, odtworzyć i skorygować.

Przekonanie, żeniektóre bezpieczeństwo nici jest lepsze niżżaden jest wadliwe. Program jest albo threadsafe, albo nie. Korzystanie z atomic może sprawić, że te aspekty Twoich programów będą bardziej odporne na problemy związane z współbieżnością, ale to nie kupi ci zbyt wiele. Oczywiście, prawdopodobnie będzie mniej awarii, ale program jest nadal bezsprzecznie niepoprawne, i nadal wybuchnie w tajemniczy sposób. Moja rada: jeśli nie masz zamiaru poświęcać czasu na naukę i pisanie poprawnych programów współbieżnych, po prostu utrzymuj je w jednym wątku (jeśli brzmi to trochę surowo: nie ma być surowo - uratuje cię to od wielu bólów głowy). Wielowątkowość i współbieżność to ogromne, skomplikowane tematy - nauka pisania naprawdę poprawnych, długowiecznych programów w wielu dziedzinach zajmuje dużo czasu.

Oczywiście, atomic można być używane do osiągnięcia threadsafety w niektórych przypadkach - ale uczynienie każdego dostępu atomowym gwarantuje nic dla bezpieczeństwa wątku. Ponadto, jest wysoce nietypowe (statystycznie), że same właściwości atomic sprawią, że Klasa będzie naprawdę bezpieczna, szczególnie gdy złożoność klasy wzrasta; bardziej jest prawdopodobne , że klasa z jednym Ivarem jest naprawdę bezpieczna, używając tylko atomiki, w porównaniu z klasą z 5 ivarami. atomic właściwości to cecha, z której korzystam bardzo rzadko (znowu niektóre ładne dużych baz kodowych i programów współbieżnych). To praktycznie narożna obudowa, jeśli atomika jest tym, co sprawia, że klasa jest naprawdę bezpieczna.

Wydajność i złożoność wykonania to główne powody, dla których należy ich unikać. W porównaniu z dostępami nieatomowymi, a częstotliwość i prostota dostępu do zmiennej, użycie atomu sumuje się bardzo szybko. Oznacza to, że dostęp atomowy wprowadza wiele złożoności wykonania w stosunku do wykonywanego zadania.

Blokady spinowe są jednymi z właściwości atomowych wdrożone. Czy chciałbyś synchronizację, taką jak spin lock lub mutex w domyśle otaczający każdy get I set, wiedząc, że nie gwarantuje to bezpieczeństwa wątku? Na pewno nie! Tworzenie dostępu do każdej nieruchomości w Twoich implementacjach może pochłonąć mnóstwo czasu procesora. Należy go używać tylko wtedy, gdy ma się do tego wyraźny powód(wspomniany również przez dasblinkenlicht+1). Szczegóły implementacji: niektóre dostępy nie wymagają blokad obrotowych, aby utrzymać Gwarancje atomic; to zależy od kilku rzeczy, takich jak architektura i rozmiar zmiennej.

Więc odpowiadając na twoje pytanie " jakieś skutki uboczne?"w formacie TL;DR: wydajność jest głównym powodem, jak zauważyłeś, podczas gdy możliwość zastosowania tego, co Atomic gwarantuje i jak jest to przydatne dla Ciebie, jest bardzo wąska na twoim poziomie abstrakcji (często niezrozumiana) i maskuje prawdziwe błędy.
 31
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-08-18 05:15:45

Nie powinieneś płacić za to, czego nie używasz. W przeciwieństwie do podłączonych komputerów, w których cykle CPU kosztują cię pod względem czasu, cykle CPU na urządzeniu mobilnym kosztują zarówno czas, jak i zużycie baterii. Jeśli aplikacja jest jednowątkowa, nie ma powodu, aby używać atomic, ponieważ operacje blokowania i odblokowywania byłyby stratą czasu i baterii. Bateria jest ważniejsza niż czas: podczas gdy opóźnienie związane z dodaniem dodatkowych operacji może być niewidoczne dla użytkownika końcowego, spędzone cykle skracają czas pracy urządzenia mobilnego po jednym ładowaniu, co wielu użytkowników uważa za bardzo ważne.

 15
Author: dasblinkenlight,
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-08-17 17:25:19