マルチスレッドプログラミング相談室 その3
■ このスレッドは過去ログ倉庫に格納されています
0702688
2005/06/25(土) 01:07:04ロックを獲得する関数を呼んだならば、それを解放する処理も必ず呼ばなくちゃいけない。
だからその解放処理をクリーンアップハンドラに指定するんだけど、その解放処理自身も mutex を使ってるから、
mutex の解放を確実にするため、pthread_mutex_unlock もクリーンアップハンドラにしたい。
処理を単純化して書くと、こんなかんじ。
void my_lock(void *my_resource)
{
pthread_cleanup_push(pthread_mutex_unlock, &mtx);
pthread_mutex_lock(&mtx);
ロック処理
pthread_cleanup_pop(1);
}
void my_unlock(void *my_resource)
{
pthread_cleanup_push(pthread_mutex_unlock, &mtx);
pthread_mutex_lock(&mtx);
アンロック処理
pthread_cleanup_pop(1);
}
で、
pthread_cleanup_push(my_unlock, &my_resource);
my_lock(&my_resource);
なんらかの処理
pthread_cleanup_pop(1);
というわけ。
そんなにおかしなことしてる?
■ このスレッドは過去ログ倉庫に格納されています