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.
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.
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.
Weiterlesen...