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(&mutex); b(); pthread_mutex_unlock(&mutex); } void b() { pthread_mutex_lock(&mutex); printf("locked\n"); pthread_mutex_unlock(&mutex); }