pthread_mutex_lockは、ミューテックスをロックするライブラリ関数・・・。
これまで、並列に実行してきたスレッド間で同期を取る方法はいくつかあるが、ミューテックスはそのひとつ・・・。
pthreadについて(同期) (1/4):CodeZine(コードジン)
pthread_mutex_t型のミューテックスを各スレッドが共有し、あるスレッドがstart_routine内でロックを掛けると、他のスレッドはその先の処理に入ることができない・・・。
アンロックすると、他のスレッドも入ることができる・・・。
このようにして、1つのスレッドしか実行できない領域(クリティカルセクション)を作るのである・・・。
渡す構造体にpthread_mutex_t型変数へのポインタも入れておく・・・。
main関数で、
変数本体は、こちらのfast・・・。
PTHREAD_MUTEX_INITIALIZERに初期化・・・。
このように、各構造体のmutexにはfastのアドレスをセットしておく・・・。
このようにして、ミューテックスfastを共有している・・・。
thread_arg->mutexをpthread_mutex_lockでロック・・・。
そのあとは、これまで通り、for文で1秒ごとに出力・・・。
終わったらpthread_mutex_unlockでアンロック・・・。
この間、他のスレッドは入ることができないので待たされることになる・・・。
$ ./pthread_mutex_lock i = 1, no = 4 i = 2, no = 4 i = 3, no = 4 i = 4, no = 4 i = 5, no = 4 i = 1, no = 3 i = 2, no = 3 i = 3, no = 3 i = 4, no = 3 i = 5, no = 3 i = 1, no = 2 i = 2, no = 2 i = 3, no = 2 i = 4, no = 2 i = 5, no = 2 i = 1, no = 1 i = 2, no = 1 i = 3, no = 1 i = 4, no = 1 i = 5, no = 1 i = 1, no = 0 i = 2, no = 0 i = 3, no = 0 i = 4, no = 0 i = 5, no = 0 $
最初に4番スレッドが実行されていて、その間他のスレッドはfor文の部分を実行できず待たされることになる・・・。
4番が終わったら、3、2、1、0、と1つずつ実行されている・・・。
Sample/pthread_mutex_lock.c at master · bg1bgst333/Sample · GitHub