57 Stimmen

Wie weist man dem Thread lokalen Speicher zu?

Ich habe eine Variable in meiner Funktion, die statisch ist, aber ich möchte, dass es statisch auf einer pro Thread-Basis sein.

Wie kann ich den Speicher für meine C++-Klasse so zuweisen, dass jeder Thread seine eigene Kopie der Klasseninstanz hat?

AnotherClass::threadSpecificAction()
{
  // How to allocate this with thread local storage?
  static MyClass *instance = new MyClass();

  instance->doSomething();
}

Dies geschieht unter Linux. Ich bin nicht mit C++0x und dies ist gcc v3.4.6.

4voto

Arne Punkte 7488

C++11 spezifiziert eine thread_local Speichertyp, verwenden Sie ihn einfach.

AnotherClass::threadSpecificAction()
{
  thread_local MyClass *instance = new MyClass();
  instance->doSomething();
}

Eine optionale Optimierung ist die Zuweisung von lokalem Speicher im Thread.

3voto

Tony The Lion Punkte 59566

Unter Windows können Sie Folgendes verwenden TlsAlloc y TlsFree um Speicher im lokalen Speicher des Threads zuzuweisen.

Um mit TLS Werte zu setzen und abzurufen, können Sie TlsSetValue y TlsGetValue bzw.

Hier können Sie ein Beispiel für die Verwendung sehen.

2voto

Arek Bal Punkte 681

Nur eine Randnotiz... MSVC++ unterstützt declspec(thread) von VSC++2005

#if (_MSC_VER >= 1400)
  #ifndef thread_local     
    #define thread_local __declspec(thread)
  #endif
#endif

Das Hauptproblem ist (das in boost::thread_specific_ptr gelöst ist), dass Variablen, die damit gekennzeichnet sind, keinen ctor oder dtor enthalten können.

1voto

chema989 Punkte 3543

Folly (Facebook Open-Source-Bibliothek) hat eine portable Implementierung von Thread Local Storage.

So die Autoren:

Verbesserter lokaler Thread-Speicher für nicht-triviale Typen (ähnliche Geschwindigkeit wie pthread_getspecific sondern verbraucht nur eine einzige pthread_key_t und 4x schneller als boost::thread_specific_ptr ).

Wenn Sie nach einer portablen Implementierung von Local Storage Thread suchen, ist diese Bibliothek eine gute Wahl.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X