マルチスレッドのプログラミング

スレッド固有データキーの作成

シングルスレッドの C プログラムは、2 つの基本クラスデータを持っています。 局所データと大域データです。マルチスレッドの C プログラムには、さらに第 3 のクラスであるスレッド固有データ (TSD) が追加されます。スレッド固有データは大域データと似ていますが、スレッドごとの専用のデータである点が異なります。


注 –

Solaris OS では、スレッドが大域変数のプライベートコピーを持つことができる代替機能がサポートされています。この機構は、スレッドローカルな記憶領域 (TLS) と呼ばれます。スレッドローカルにする変数を宣言するためにキーワード __thread が使用され、コンパイラは、これらの変数がスレッド単位に割り当てられるように自動的に配置します。詳細については、『リンカーとライブラリ』の第 8 章「スレッド固有領域 (TLS)」を参照してください。


スレッド固有データ (TSD) は、スレッド単位で維持管理されます。TSD は、特定のスレッド固有のデータを定義し参照する唯一の手段となります。スレッド固有データの各項目は、プロセス内のすべてのスレッドから参照可能な特定のキー (key) と関連付けられます。そのキー (key) を使用することによって、スレッドはスレッド単位で維持管理されるポインタ (void *) にアクセスできます。

pthread_key_create の構文

int pthread_key_create(pthread_key_t *key,
    void (*destructor) (void *));
#include <pthread.h>

pthread_key_t key;
int ret;

/* key create without destructor */
ret = pthread_key_create(&key, NULL);

/* key create with destructor */
ret = pthread_key_create(&key, destructor); 

pthread_key_create(3C) は、プロセス内のスレッド固有データを識別するためのキー (key) を割り当てます。このキーは、プロセス内のすべてのスレッドに大域的なキーです。スレッド固有データが生成された時点では、すべてのスレッドで、キーの初期値として NULL が関連付けられています。

pthread_key_create() は、キーの使用前に各キーについて 1 回呼び出します。プロセス内のすべてのスレッドが共有するキーについては、暗黙の同期はありません。

作成されたキーに対して、各スレッドは特定の値を結び付けることができます。その値はスレッドに固有で、スレッドごとに独立に維持管理されます。スレッド単位での割り当ては、キーがデストラクタ関数 (destructor) で作成された場合は、スレッドの終了時にその割り当てを解除されます。

pthread_key_create() が正常終了すると、割り当てられたキーは key が指す位置に格納されます。このキーに対する記憶領域とアクセスとの同期は呼び出し側の責任でとらなければなりません。

各キーに任意で、デストラクタ関数を関連付けることができます。あるキーが NULL でないデストラクタ関数を持っていて、スレッドがそのキーに対して NULL 以外の値を関連付けている場合、そのスレッドの終了時に現在関連付けられている値を指定してデストラクタ関数が呼び出されます。どの順番でデストラクタ関数が呼び出されるかは不定です。

pthread_key_create の戻り値

pthread_key_create() は、正常終了時に 0 を返します。それ以外の戻り値は、エラーが発生したことを示します。以下のいずれかの条件が検出されると pthread_key_create() は失敗し、次の値を戻します。


EAGAIN

説明:

キーの名前空間が使い果たされました。


ENOMEM

説明:

仮想記憶が足りないので、新しいキーを作成できません。