2013-08-06 13 views
6

Mam problemy z uzyskaniem pozornie nieprawidłowych wyników z biblioteki pthread_getspecific w bibliotece, która jest przeznaczona do łączenia z różnymi aplikacjami systemu iOS.Jak wykonać wydajną lokalną pamięć wątków w systemie iOS

widzę, że Apple writes:

Kakao i POSIX przechowywać słownika wątek na różne sposoby, więc nie można mieszać i wzywa mecz dwóch technologiach. Tak długo, jak będziesz trzymać się jednej technologii w swoim kodzie nici, wyniki końcowe powinny być podobne. W Cocoa używa się metody threadDictionary obiektu NSThread do pobrania obiektu NSMutableDictionary, do którego można dodać klucze wymagane przez wątek. W POSIXie używasz funkcji pthread_setspecific i pthread_getspecific, aby ustawić i uzyskać klucze i wartości twojego wątku.

Czy to oznacza, że ​​można się spodziewać ani funkcje kakao ani POSIX TLS do pracy w kodzie biblioteki, kiedy nie wiemy, czy kod, który wzywa nas jest już za pomocą jednego lub drugiego?

W jaki sposób uzyskuje się do przechowywania i pobierania wskaźnik lokalny wątku solidnie w tych okolicznościach?

Czy istnieje natywny interfejs API Darwin TLS, którego powinniśmy używać zamiast kakao lub POSIX?

+0

** Rozwiązany **: Objawy, które początkowo powodowały podejrzenie nieprawidłowego działania pthread_getspecific, okazały się być spowodowane zwisającymi wskaźnikami pozostawionymi przez niespokrewniony stan wyścigu w innym miejscu w programie. –

Odpowiedz

6

Uważam, że dokumentacja Apple'a sprawia, że ​​nie można użyć numeru pthread_setspecific, aby ustawić wartość, a następnie oczekiwać, że będzie dostępna pod numerem threadDictionary. Nie oczekiwałbym, że będą bezpośrednio ingerować w siebie; są po prostu oddzielne.

To powiedziawszy, jeśli jest to kod specyficzny dla iOS, to do zarządzania tym jest the strongly preferred way z GCD, a nie z wątkami POSIX. GCD oferuje odpowiednik TLS w postaci dispatch_get_specific, dispatch_queue_get_specific i dispatch_queue_set_specific. Ale zapewnia również znacznie lepsze zarządzanie wątkami niż wątki POSIX.

+0

Zakłócenia są tak miłym wyjaśnieniem wypadków, które widzimy, chociaż ... Jest to warstwa kleju specyficzna dla systemu iOS dla istniejącego kodu, która chce zobaczyć wspólną abstrakcję dla wszystkich platform, na których działa. Wejście do blokady zamawiającego, która chce uzurpować sobie rolę lub nasze dobrze działające koncepcje współbieżności, nie wchodzi w grę. –

+0

(W końcu nie było żadnych zakłóceń, tylko snafu współbieżne gdzie indziej w programie, które spowodowało zwinięcie niektórych wskaźników). –

1

Jeśli nie masz nic przeciwko używaniu C++, boost ma wartość thread_specific_ptr. Obsługuje iOS. Jeśli nie chcesz używać C++, implementacja prawdopodobnie oferuje kilka wskazówek, jak sprawić, by działało bez wielu zewnętrznych zależności.

Powiązane problemy