2013-08-06 12 views
6

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?

+0

** 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. –

Antwort

6

Ich glaube, der Punkt, den Apples Dokumente machen, ist, dass Sie pthread_setspecific nicht verwenden können, um einen Wert festzulegen und dann erwarten, dass es in threadDictionary verfügbar ist. Ich würde nicht erwarten, dass sie sich gegenseitig stören. Sie sind nur getrennt.

Das heißt, wenn das iOS-spezifischen Code ist, dann the strongly preferred way, um dies zu verwalten ist mit GCD anstelle von POSIX-Threads. GCD bietet das Äquivalent von TLS in Form von dispatch_get_specific, dispatch_queue_get_specific und dispatch_queue_set_specific. Aber es bietet auch eine viel bessere Thread-Verwaltung als POSIX-Threads.

+0

Interferenz wäre so eine nette Erklärung für die Abstürze, die wir sehen, aber ... Es ist eine iOS-spezifische Klebeschicht für vorhandenen Code, der eine gemeinsame Abstraktion für die Vielzahl von Plattformen sehen möchte, auf denen er läuft. Es ist keine Option, in eine Verkäuferbindung einzutreten, die die Rolle oder unsere bestehenden gut funktionierenden Concurrency-Konzepte übernehmen möchte. –

+0

(Es gab schließlich keine Interferenz, nur ein Nebenläufigkeits-Snafu an anderer Stelle im Programm, das einige Zeiger dazu brachte, zu baumeln). –

1

Wenn es Ihnen nichts ausmacht C++ zu verwenden, hat Boost thread_specific_ptr. Es unterstützt iOS. Wenn Sie nicht C++ verwenden möchten, bietet die Implementierung wahrscheinlich einige Hinweise, wie Sie es ohne viele externe Abhängigkeiten zum Laufen bringen können.

Verwandte Themen