読者です 読者をやめる 読者になる 読者になる

pthread_rwlock_rdlock

pthread_rwlock_rdlockは、リードロックを掛けるライブラリ関数・・・。

pthread_rwlock_rdlock(3) - Linux man page

あるスレッドが参照しようとしている値を、他のスレッドが参照する場合はロックする必要はないという考えから、リードロック同士なら実際にはロックは掛からないという仕組み・・・。

pthreadについて(同期) (3/4):CodeZine(コードジン)

pthread_rwlock_t型ポインタrwlockに加えて、count1、count2という2つのint型ポインタを用意・・・。

こちらは格納する変数の実体・・・。

このようにして、count1, count2, rwlockのアドレスを各thread_argに渡して、共有・・・。

start_routineでは、pthread_rwlock_rdlockを掛けた後、

スレッド番号を表すnoごとに処理を分ける・・・。
noが0の場合、

出力してsleep(1)を3回繰り返した後、count1の参照先(つまりcount1の実体)に1を代入している・・・。

noが1の場合、出力してsleep(1)をした後、count2の値を1, 2, 3, 4まで増やしている・・・。(最後のsleep(1)の後はやらない・・・。)

このように2つのスレッドで変化をつける・・・。
そして、スレッドno0はcount1しか変更しないし、スレッドno1はcount2しか変更しない・・・。

この状態で実行したらどうなるか・・・。

$ ./pthread_rwlock_rdlock
no = 1, count1 = 0, count2 = 0
no = 0, count1 = 0, count2 = 0
no = 1, count1 = 0, count2 = 1
no = 0, count1 = 0, count2 = 1
no = 1, count1 = 0, count2 = 2
no = 0, count1 = 0, count2 = 2
no = 1, count1 = 0, count2 = 3
no = 0, count1 = 1, count2 = 3
no = 1, count1 = 1, count2 = 4
no = 0, count1 = 1, count2 = 4
$

2つのスレッドがほぼ同時に実行された・・・。
no0の4回目出力の直前に1になっている・・・。
直前のno1の4回目出力ではまだ0のまま・・・。
リードロックを掛けたスレッド同士なら、同期のためのストップがかからず、ロックがかかってないように同時に実行されることを表している・・・。

Sample/pthread_rwlock_rdlock.c at master · bg1bgst333/Sample · GitHub