2013-08-06 20 views
6

Sto riscontrando dei problemi con risultati apparentemente errati da pthread_getspecific in una libreria progettata per collegarsi a varie app iOS.Come eseguire una solida archiviazione locale dei thread in iOS

vedo che Apple writes:

Cacao e POSIX memorizzare il dizionario filo in modi diversi, quindi non è possibile combinare le chiamate verso le due tecnologie. Finché si rimane con una tecnologia all'interno del codice del thread, tuttavia, i risultati finali dovrebbero essere simili. In Cocoa, si utilizza il metodo threadDictionary di un oggetto NSThread per recuperare un oggetto NSMutableDictionary, al quale è possibile aggiungere qualsiasi chiave richiesta dal thread. In POSIX, si utilizzano le funzioni pthread_setspecific e pthread_getspecific per impostare e ottenere le chiavi e i valori del thread.

Questo significa che le funzioni di cacao né POSIX TLS possono essere tenuti a lavorare in codice della libreria, quando non sappiamo se il codice che ci chiama sta già usando uno o l'altro?

Come si può memorizzare e recuperare un puntatore locale del filo in modo affidabile in queste circostanze?

Esiste un'API di supporto Darwin TLS nativa che dovremmo utilizzare al posto di Cocoa o POSIX?

+0

** Risolto **: i sintomi che inizialmente mi hanno fatto sospettare un malfunzionamento di pthread_getspecific si sono rivelati causati da puntatori penzolanti lasciati da una condizione di competizione non correlata altrove nel programma. –

risposta

6

Credo che il punto che i documenti di Apple stanno facendo è che non è possibile utilizzare pthread_setspecific per impostare un valore e quindi aspettarsi che sia disponibile in threadDictionary. Non mi aspetterei che interferiscano direttamente l'uno con l'altro; sono solo separati.

Detto questo, se questo è un codice specifico per iOS, quindi the strongly preferred way gestirlo con GCD anziché con i thread POSIX. GCD offre l'equivalente di TLS sotto forma di dispatch_get_specific, dispatch_queue_get_specific e dispatch_queue_set_specific. Ma fornisce anche una gestione dei thread molto migliore rispetto ai thread POSIX.

+0

L'interferenza sarebbe una così bella spiegazione per i crash che stiamo vedendo, però ... È un layer di colla specifico per iOS per il codice esistente che vuole vedere un'astrazione comune per tutte le moltitudini di piattaforme su cui gira. Entrare in un lock-in del fornitore che vuole usurpare il ruolo o i nostri concreti concetti di concorrenza esistenti non è un'opzione. –

+0

(Non ci sono state interferenze dopo tutto, solo una raffica di concorrenza in altre parti del programma che ha fatto sì che alcuni puntatori si dessero a ciondolare). –

1

Se non ti dispiace usare C++, boost ha thread_specific_ptr. Supporta iOS. Se non si desidera utilizzare C++, l'implementazione offre probabilmente alcuni suggerimenti su come farlo funzionare senza un sacco di dipendenze esterne.

Problemi correlati