Ich habe einige Probleme mit scheinbar falsche Ergebnisse von pthread_getspecific
in einer Bibliothek, die entwickelt wurde, um in verschiedene iOS-Apps verknüpfen.Robuste Thread-lokale Speicherung in iOS
Ich sehe, dass Apple writes:
Kakao und POSIX speichern den Faden Wörterbuch auf unterschiedliche Weise, so kann man nicht mischen und anzupassen, ruft zu den beiden Technologien. Solange Sie bei einer Technologie innerhalb Ihres Thread-Codes bleiben, sollten die Endergebnisse jedoch ähnlich sein. In Cocoa rufen Sie mit der threadDictionary-Methode eines NSThread-Objekts ein NSMutableDictionary-Objekt ab, dem Sie alle für Ihren Thread erforderlichen Schlüssel hinzufügen können. In POSIX verwenden Sie die Funktionen pthread_setpecific und pthread_getspecific, um die Schlüssel und Werte Ihres Threads festzulegen und abzurufen.
Heißt das, dass weder die Cocoa noch POSIX TLS-Funktionen erwartet werden kann, die in der Bibliothek Code arbeiten, wenn wir nicht wissen, ob der Code, der uns ruft bereits eine Verwendung oder das andere?
Wie kann man unter diesen Umständen einen Thread-lokalen Zeiger robust speichern und abrufen?
Gibt es eine native Darwin TLS-Unterstützungs-API, die wir anstelle von Cocoa oder POSIX verwenden sollten?
** Behoben **: Die Symptome, die anfangs den Verdacht auf eine Fehlfunktion von pthread_getspecific weckten, entpuppten sich als dangling pointer, die durch eine nicht verwandte Race Condition an einem anderen Ort im Programm verursacht wurden. –