この記事では、C++11から導入されたスレッドローカル変数について紹介します。
目次
スレッドローカル変数とは
スレッドローカル変数は、複数のスレッドが同じ変数を使う場合に各スレッドが独自のコピー変数を持つことができる機能です。
スレッドローカル変数を使うことによって、スレッド間で変数の競合やデータ競合を避けることができます。
特徴
- 初期化
-
スレッドローカル変数の初期化タイミングは、各スレッドがその変数を最初に使用したタイミング
各スレッドが独立した変数のコピーを持つため、変数の初期化もスレッド毎
- スコープ
-
スレッドローカル変数はグローバル変数、静的変数、または関数内の静的変数とともに使用可能
クラスのメンバー変数として使うことも可能
- デストラクタの呼び出し
-
スレッドローカル変数のライフサイクルはスレッドのライフサイクルに依存しており、スレッドが終了する際に変数のデストラクタが呼び出される
注意点
- メモリ使用量
-
スレッド数が増えると、それぞれのスレッドが変数のコピーを持つため、メモリ使用量が増加する
- スレッド間でのデータ共有
-
スレッドローカル変数を使うと、スレッド間でのデータ共有が困難になるため、必要に応じてデータの共有や通信の方法を設計する必要がある
実装例
スレッドローカル変数の簡単な実装例を紹介します。
#include <iostream>
#include <thread>
thread_local int localVar = 0;
void threadFunction(int id) {
localVar = id;
std::cout << "Thread ID: " << id << " | Local Variable: " << localVar << std::endl;
}
int main() {
std::thread t1(threadFunction, 1);
std::thread t2(threadFunction, 2);
std::thread t3(threadFunction, 3);
t1.join();
t2.join();
t3.join();
return 0;
}
この例では、localVar
はスレッドローカル変数として宣言されているため、各スレッドがlocalVar
の独自のコピーを持ちます。そのため、スレッド間でlocalVar
の値が競合することはありません。
実行結果
Thread ID: 1 | Local Variable: 1
Thread ID: 2 | Local Variable: 2
Thread ID: 3 | Local Variable: 3