Threadlokale Daten

Threadlokale Daten werden durch das Schlüsselwort thread_local definiert. Sie sind schnell erklärt.

thread_local

Threadlokale Daten werden bei Bedarf für jeden Thread erzeugt. Sie gehören exklusiv einem Thread und verhalten sich wie statische Daten. Das heißt insbesondere, sie werden bei ihrer ersten Verwendung erzeugt und ihre Lebenszeit ist an die Lebenszeit ihres Threads gebunden. Gerne werden threadlokale Daten auch threadlokaler Speicher genannt.

Der Umgang mit threadlokalen Daten birgt keine großen Überraschungen.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <string>
#include <mutex>
#include <thread>

std::mutex coutMutex;

thread_local std::string s("hello from ");

void addThreadLocal(std::string const& s2){

  s+=s2;
  // protect std::cout
  std::lock_guard<std::mutex> guard(coutMutex);
  std::cout << s << std::endl;
  std::cout << "&s: " << &s << std::endl;
  std::cout << std::endl;

}

int main(){

  std::cout << std::endl;

  std::thread t1(addThreadLocal,"t1"); 
  std::thread t2(addThreadLocal,"t2"); 
  std::thread t3(addThreadLocal,"t3"); 
  std::thread t4(addThreadLocal,"t4"); 

  t1.join();
  t2.join();
  t3.join();
  t4.join();

}

 

 In Zeile 8 wird durch das Schlüsselwort thread_local der threadlokale String s angelegt. Die Threads t1 - t4 (Zeile 25 - 28) führen als Arbeitspaket die Funktion addThreadLocal (Zeile 10 - 19) aus. Die Threads erhalten als Argument die Strings "t1" bis "t4" und addieren diese zu dem threadlokalen String s hinzu. Zusätzlich gibt die Funktion die Adresse des threadlokalen Strings s in Zeile 16 aus.

 

threadLocal

 

Die Ausgabe des Programms zeigt implizit durch die Ausgabe (Zeile 15) und explizit durch seine Adresse (Zeile 16), dass der threadlokale String s für jeden Thread neu angelegt wird. Zum einen enthält die Ausgabe immer einen neuen threadlokalen String s, zum anderen besitzt der String s für jeden Thread eine neue Adresse.

Wie geht's weiter?

Bedingungsvariablen sind deutlich anspruchsvoller als threadlokale Daten. Dazu mehr im nächsten Artikel.

 

 

 

 

 

 

 

title page smalltitle page small Go to Leanpub/cpplibrary "What every professional C++ programmer should know about the C++ standard library".   Hole dir dein E-Book. Unterstütze meinen Blog.

 

Mentoring

Stay Informed about my Mentoring

 

Rezensionen

Tutorial

Besucher

Heute 1117

Gestern 1772

Woche 10432

Monat 35291

Insgesamt 3334203

Aktuell sind 41 Gäste und keine Mitglieder online

Kubik-Rubik Joomla! Extensions

Abonniere den Newsletter (+ pdf Päckchen)

Beiträge-Archiv

Sourcecode

Neuste Kommentare