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

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

シングルスレッドの C プログラムでは、データは局所データと広域データという 2 つの基本的なクラスに分類されます。一方、マルチスレッドの C プログラムでは、これに第 3 のクラスであるスレッド固有データ (Thread-Specific Data (TSD)) が追加されます。これは広域データと似ていますが、スレッドごとの専用のデータである点が異なります。

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

pthread_key_create(3THR)

pthread_key_create(3THR) は、プロセス内のスレッド固有データを識別するためのキーを割り当てます。このキーはプロセス内のすべてのスレッドから参照可能で、すべてのスレッドでそのキーが作成された時点では、初期値として NULL が関連付けられています。

pthread_key_create() は、キーの使用前に各キーについて 1 回呼び出します。暗黙の同期はありません。

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


プロトタイプ:
int	pthread_key_create(pthread_key_t *key,
    void (*destructor) (void *));

#include <pthread.h>

pthread_key_t key;
int ret;

/* デストラクタを指定しないキーの作成 */
ret = pthread_key_create(&key, NULL);

/* デストラクタを指定したキーの作成 */
ret = pthread_key_create(&key, destructor); 

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

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

戻り値

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


EAGAIN

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


ENOMEM

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