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

スレッド固有データキーの削除

既存のスレッド固有データキーを削除するには、pthread_key_delete(3C) を使用します。このキーは無効になっているので、キーに関連付けられているあらゆるメモリーを解放できます。無効なキーが参照されると、エラーが返されます。

pthread_key_delete の構文

int pthread_key_delete(pthread_key_t key);
#include <pthread.h>

pthread_key_t key;
int ret;

/* key previously created */
ret = pthread_key_delete(key); 

key を削除したあとで pthread_setspecific() または pthread_getspecific () 呼び出しを使用してそのキーを参照しようとすると、予期しない結果が発生します。

pthread_key_delete() 関数を呼び出す前にスレッド固有のリソースを解放するのは、プログラマの責任です。この関数はデストラクタ関数をいっさい呼び出しません。pthread_key_create()pthread_key_delete() を繰り返し呼び出すと、問題が発生する可能性があります。

この問題は、Solaris 実装で、key の値が pthread_key_delete() によって無効にされたあとで再利用されないために発生します。pthread_key_create() を呼び出すたびに新しいキー値が割り当てられるため、キー情報を保持するために割り当てられる内部メモリーが増えます。pthread_key_create() ... pthread_key_delete() の無限ループによって、最終的にはすべてのメモリーが使い果たされます。可能であれば、目的の各キーに対して pthread_key_create() を 1 回だけ呼び出し、pthread_key_delete() は呼び出さないようにしてください。

pthread_key_delete の戻り値

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


EINVAL

説明:

key の値が有効ではありません。