2013-09-06 14 views
6

W systemie Android mogłem bezpiecznie uzyskiwać dostęp i modyfikować typy pierwotne z różnych wątków. Używałem tego do udostępniania danych między moją pętlą rysowania OpenGL a ustawieniami użytkownika, które zostały zmodyfikowane w głównym interfejsie Androida dla Androida. Przechowując każde ustawienie w typie pierwotnym i czyniąc je niezależnymi od wartości innych, modyfikowanie wszystkich tych zmiennych bez użycia blokad lub słowa kluczowego synchronizacji było bezpieczne dla wątków.Czy jądro atomowe ma znaczenie dla syntetyzowanego prymitywu?

Czy jest tak również w Objective-C? Czytałem, że umieszczenie atomu na zmiennej zasadniczo powoduje, że syntetyzowany program pobierający i ustawiający używa blokad, podobnie jak przy użyciu metod synchronizowanych w Javie. I przeczytałem, że powodem jest to, że obiekt nie jest częściowo modyfikowany, gdy jest czytany przez inny wątek.

Ale czy typy pierwotne mogą być częściowo zmodyfikowane, tak jak w Javie? Jeśli tak jest, wydaje się, że mógłbym używać mojego starego paradygmatu z Javy do udostępniania danych między wątkami. Ale słowo atomowe byłoby bezcelowe dla prymitywnego, prawda?

Przeczytałem również, że bardziej niezawodnym i szybszym rozwiązaniem niż używanie zmiennych atomowych jest kopiowanie obiektów przed ich użyciem, jeśli są dostępne z wielu wątków. Ale nie jestem pewien, jak można to osiągnąć. Czy obiekt nieatomowy nie może zostać zmodyfikowany podczas kopiowania, co powoduje uszkodzenie kopii?

+1

dlaczego nie zadeklarować typu pierwotnego z atomowym, aby zapewnić bezpieczeństwo wątku? – John

+0

możliwy duplikat właściwości [Atomic vs nonatomic] (http://stackoverflow.com/questions/588866/atomic-vs-nonatomic-properties) – bbum

+0

@ user1256663 Słyszałem, że są bardzo powolne, a ja piszę Aplikacja OpenGL. Obawy dotyczące framerate. – Tenfour04

Odpowiedz

6

prymitywne typy nie są gwarancją pewności przed częściowo zmodyfikowany, ponieważ modyfikacje prymitywnych typów nie są gwarancją atomowej w C i Objective-C odziedziczy stamtąd. Jedyne gwarancje C dotyczą punktów sekwencji i nie ma wymogu, by przetwarzanie między dwoma punktami sekwencyjnymi było atomowe - regułą jest, że każde pełne wyrażenie jest punktem sekwencji.

W praktyce modyfikowanie elementów pierwotnych jest często procesem dwuetapowym; modyfikacja jest dokonywana w rejestrze, a następnie zapisywana do pamięci. Jest bardzo mało prawdopodobne, aby sam zapis nie był atomowy, ale nie ma również gwarancji, kiedy to nastąpi w porównaniu do modyfikacji. Nawet z kwalifikacją volatile, jedyne zapewnione gwarancje dotyczą punktów sekwencji.

Apple udostępnia niektóre funkcje C dla działań atomowych za pośrednictwem OSAtomic.h, które są mapowane bezpośrednio do wyspecjalizowanych instrukcji atomowych, które procesory oferują do implementacji mechanizmów współbieżności. Możliwe, że możesz użyć jednego z nich bardziej bezpośrednio niż przez ciężki muteks.

wspólne wzorce w Objective-C są:

  • niezmienne obiekty i przekształceń funkcjonalnych - istnieją powody, zarządzanie pamięcią, jak dobrze, ale to częściowo dlatego NSString, NSArray, etc, są wyraźnie odmienne od NSMutableString, NSMutableArray, etc ;
  • Kolejki seryjnej wysyłki, które można łączyć z kopią-modyfikuj-zamień, kopiując w kolejce, przechodząc gdzie indziej w celu modyfikacji, a następnie przeskakując z powrotem do kolejki, aby ją zastąpić;
  • takie jak s, NSConditionLock s lub inne jawne mechanizmy synchronizacji, jakie są odpowiednie.

Głównym wątkiem jest kolejka wysyłania, dlatego możesz całkowicie zignorować problem współbieżności, jeśli ograniczysz się do niego.

-2

Nie wierzę, że można częściowo zmodyfikować typ pierwotny, jest to część tego, co czyni je prymitywnymi. Możesz go zmodyfikować lub nie. W tym sensie powiedziałbym, że są bezpieczne dla wątków.

Masz rację, gdy mówisz, że słowo atomiczne byłoby bezcelowe w przypadku typu pierwotnego.

Ktoś już wziął ukłucie w ten tutaj: Objective-c properties for primitive types

+1

Nie można "zobaczyć" częściowo zmodyfikowanego typu podstawowego * na większości architekturach *, o ile prymityw jest wyrównany do pamięci podręcznej. –

+1

Zależy od architektury pierwotnej i architektury. Na przykład niektóre architektury ARM używają ośmio-bajtowych podwójnych, ale formalnie obiecują tylko atomowość dla czterobajtowych ładunków i zapasów. –

3

Atomowe zsyntetyzowane właściwości @ są odporne na równoczesne częściowe aktualizacje. Metody dostępu wykorzystają w razie potrzeby blokadę tej architektury.

Ogólnie rzecz biorąc, typy pierwotne w C niekoniecznie są bezpieczne w odniesieniu do współbieżnych aktualizacji częściowych.

Powiązane problemy