[mutex] mutexの多重lock

POSIX mutexを使ったプログラムをFreeBSDからLinux(Fedora core 13)に移植したところmutexまわりの動作が変わっていた
動作が違うのは、同じthread中でmutexを何度もlockした場合。
WindowsのMutexクラスやFreeBSDでは、同じthread内では繰り返しmutexをlockしたとき、2回目以降でもsleepせずにmutex lockを取得できる。
POSIX mutexの動作はPOSIXで規定されているのでおなじように動くと想定してLinuxに移植したところ、2回目のmutex lockでsleepしてしまった。
以下のソースコードで,FreeBSDでは関数bは終了し、Linuxではbの中でsleepして戻ってこない。

#include <pthread.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void a();
void b();
int main()
{
     a();
}

void
a()
{
     pthread_mutex_lock(&amp;mutex);
     b();
     pthread_mutex_unlock(&amp;mutex);
}

void
b()
{
    pthread_mutex_lock(&amp;mutex);
    printf("locked\n");
    pthread_mutex_unlock(&amp;mutex);
}
広告
%d人のブロガーが「いいね」をつけました。