9

Ich habe Kerrisks The Linux Programming Interface: A Linux and UNIX System Programming Handbook Kapitel 31 über Threads gelesen. Das Kapitel enthält Thread-spezifische Daten (Abschnitt 31.3.4) und lokalen Thread-Speicher (Abschnitt 31.4). Die Themen wurden auf den Seiten 663-669 behandelt.Threadspezifische Daten im Vergleich zum lokalen Thread-Speicher

Thema Spezifische Daten (pthread_key_create, pthread_setspecific, pthread_getspecific und Freunde) sieht mächtiger, scheint aber ein wenig umständlich zu bedienen zu sein und erscheint häufiger den Speichermanager zu verwenden.

Thread Local Storage (__thread auf statische und globale Deklarationen) sieht ein wenig weniger leistungsfähig, da es auf Kompilierzeit beschränkt ist, aber es scheint einfacher zu sein, und scheint zur Laufzeit aus dem Speichermanager zu bleiben.

Ich könnte mich irren über die Runtime-Speicher-Manager, da es Code hinter den Kulissen sein könnte, ruft pthread_key_create, wenn es auf __thread Variablen trifft.

Kerrisk bot keinen Vergleich/Kontrast der beiden Strategien, und er machte keine Empfehlung, wann in einer bestimmten Situation zu verwenden.

Um einen Kontext zu der Frage hinzuzufügen: Ich werte eine 3rd-Party-Bibliothek aus. Die Bibliothek verwendet Globals, verwendet nicht Sperrung, und ich möchte es in einem Multi-Thread-Programm verwenden. Das Programm verwendet Threading, um Netzwerklatenzen zu minimieren.

Gibt es einen erfolgreichen Gewinner? Oder gibt es verschiedene Szenarien, die den Einsatz des einen oder anderen rechtfertigen?

+1

Im Allgemeinen ist es vorzuziehen, keines von beiden zu verwenden. Warum willst du das überhaupt benutzen? –

+0

Danke David. Es ist ein netzwerkbasiertes Multithread-Programm, das dazu beiträgt, den Durchsatz angesichts von Latenzen aufrechtzuerhalten. Ich möchte versuchen, eine 3rd-Party-Bibliothek für die Analyse, aber die Bibliothek verwendet statische globale für den Status. – jww

+1

Hmm, chaotisch. Ich kann sehen, woher du kommst. Ideale Welt hat die Information, die durch Parameter übergeben wird. Vielleicht überlegen Sie sich eine Thread-freundlichere Bibliothek? –

Antwort

6

Die pthread_key_create und Freunde sind viel älter und somit auf mehreren Systemen unterstützt.

Die __thread ist ein relativer Neuling, ist in der Regel viel bequemer zu verwenden, und (according to Wikipedia) ist auf den meisten POSIX-Systemen unterstützt, die nach wie vor Angelegenheit: Solaris Studio C/C++, IBM XL C/C++, GNU C, Clang und Intel C++ Compiler (Linux-Systeme).

die __thread hat auch einen wesentlichen Vorteil, dass sie von Signal-Handler verwendbar ist (mit Ausnahme der Verwendung von __thread von dlopen ed Shared Library finden sie in diesem bug), weil seine Verwendung nicht involvieren Sie malloc (mit der gleichen Ausnahme).

+0

Siehe auch https://blogs.oracle.com/seongbae/entry/pthread_get_set_specific_vs. Eine Einschränkung von 'pthread_key_create()' ist, dass die Aufrufe nicht immer immer erfolgreich sind.Das macht diese Aufrufe unbrauchbar in '__init'-Typ-Funktionen, ohne einige Annahmen zu treffen. Also, '__thread' ist eine einfache und garantierte Art von threadspezifischen Daten. – ReddyVeeru

1

Die Pthread-Schnittstellen sind POSIX-Standard, daher sind sie portabler. Verwenden Sie sie, wenn Sie beabsichtigen, den Code für etwas außer einem Linux-System zu verwenden. Auf der anderen Seite, wenn Sie ausschließlich auf gcc/linux, dann ist der __thread-Mechanismus sicherlich einfacher zu bedienen. Beachten Sie jedoch, dass es sich um eine gcc-spezifische Erweiterung handelt, die nicht auf allen Plattformen unterstützt wird.

+2

C++ 11 hat einen 'thread_local'-Spezifizierer, der' __thread 'ähnlich ist, und dieser sollte schließlich überall unterstützt werden. –

+0

'__thread' ist * nicht * eine GCC-spezifische Erweiterung - sie wird von ungefähr allen UNIX-Compilern unterstützt, die heute wichtig sind. –

Verwandte Themen