読者です 読者をやめる 読者になる 読者になる

C++0x thread_local

C++

マルチスレッドアプリケーションでは、スレッドごとに一意なデータを保持する必要が起きます。
これを、スレッドローカル記憶域と呼びます。


C++0x では、これを言語でサポートするため、 thread_local というキーワードが追加され
thread_local を付けて宣言された変数は、スレッドごとに一度だけインスタンス化されます。

#include <threads>

thread_local int j = 42;

void foo() { j = 43; }

int main()
{
    std::thread t(foo);
    t.join();

    if(j != 42)
        abort();
}


【スレッド変数のアドレス】
&演算子は、スレッド変数に使用された場合、現在のスレッドの変数のアドレスを返します。
なので、スレッド変数のアドレスは定数ではありません。


スレッドローカル記憶域は、アクセス可能性ではなく生存期間と有効期間を定義するので
アドレスをとってほかのスレッドに渡してもかまいません。


スレッド変数のアドレスは、対応するスレッドが生存している間は固定です。
その変数が生存している間、プログラム中のどのスレッドでも自由に使用されてもかまいません。


スレッドが終了したとき、スレッド変数のアドレスはすべて無効になるので使用してはいけません。


【スレッド変数の動的初期化】
現在、スレッドローカル記憶域のすべての実装(GNUとかHPとかIBMとかMicrosoftとかSunとか)は動的初期化をサポートしていません。

C++0x のスレッドローカル記憶域は、動的初期化をサポートします。



N2659 Thread-Local Storage

C++0x言語拡張まとめ