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

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() は呼び出さないようにしてください。