pthread_rwlock_wrlockは、ライトロックを掛けるライブラリ関数・・・。
pthread_rwlock_wrlock(3) - Linux man page
値を参照する場合は、リードロックを掛けた・・・。
値を変更する場合は、ライトロックを掛ける・・・。
そして、リードロック×ライトロック、ライトロック×リードロック、ライトロック×ライトロックの場合は、ロックがかかり、同時に実行されず、後のスレッドのほうが待たされることになる・・・。
no0の時は、pthread_rwlock_rdlockでリードロックを掛け、no1の時は、pthread_rwlock_wrlockでライトロックを掛けている・・・。
内部の処理は変わらず、実際には他のスレッドから値が変更されることは無いが、リードロック×ライトロックの組み合わせなので、
$ ./pthread_rwlock_wrlock no = 1, count1 = 0, count2 = 0 no = 1, count1 = 0, count2 = 1 no = 1, count1 = 0, count2 = 2 no = 1, count1 = 0, count2 = 3 no = 1, count1 = 0, count2 = 4 no = 0, count1 = 0, count2 = 4 no = 0, count1 = 0, count2 = 4 no = 0, count1 = 0, count2 = 4 no = 0, count1 = 1, count2 = 4 no = 0, count1 = 1, count2 = 4 $
このように同時に実行されることなく、no1が全部処理されてからno0の処理が始まる・・・。
Sample/pthread_rwlock_wrlock.c at master · bg1bgst333/Sample · GitHub