スレッドで実行する次のサンプルコード(以下のコードを参照)があります。
A: rd-lock
B: wr-lock (waiting)
A: rd-lock (recursive)
A: rd-unlock (recursive)
A: rd-unlock
B: wr-locked (wake after wait)
B: wr-unlock.
基本的に、読み取りロックは再帰的です。POSIX標準で必要です(読み取りロックは再帰的である必要がありますが、書き込みロックには指定されていません)。これはLinux、FreeBSD、Solarisで機能しますが、Darwin / MacOSXでは機能しません。
以下のサンプルは、Linuxで次の出力を提供します。
read locking
read locked
write locking
read locking 2
read locked 2
read unlocked 2
read unlocked
write locked
write unlocked 2
ダーウィンにいる間、それは印刷します:
read locking
read locked
write locking
read locking 2
そして、ここでのデッドロック(継続しません)、基本的には再帰的な読み取りロックを尊重しません。
期待どおりに機能する可能性のあること(フラグ、定義、特別なライブラリバージョンとのリンク)はありますか?
サンプルコード
#include <pthread.h>
#include <stdio.h>
pthread_rwlock_t lock;
void *thread_r(void *p)
{
printf("read locking\n");
pthread_rwlock_rdlock(&lock);
printf("read locked\n");
usleep(500*1000);
printf("read locking 2\n");
pthread_rwlock_rdlock(&lock);
printf("read locked 2\n");
usleep(500*1000);
pthread_rwlock_unlock(&lock);
printf("read unlocked 2\n");
usleep(500*1000);
pthread_rwlock_unlock(&lock);
printf("read unlocked\n");
}
void *thread_w(void *p)
{
usleep(250*1000);
printf("write locking\n");
pthread_rwlock_wrlock(&lock);
printf("write locked\n");
pthread_rwlock_unlock(&lock);
printf("write unlocked 2\n");
}
int main()
{
pthread_t a,b;
pthread_rwlock_init(&lock,NULL);
pthread_create(&a,NULL,thread_r,0);
pthread_create(&b,NULL,thread_w,0);
pthread_join(a,NULL);
pthread_join(b,NULL);
return 0;
}