pthread_join

pthread_joinは、別のスレッドが終了するまで待つライブラリ関数・・・。

Man page of PTHREAD_JOIN

第2引数に変数のアドレスを渡すと、start_routineの終了コードをその変数に格納する・・・。
終了まで待つと同時に、終了コードも取得できるという形・・・。

start_routineの戻り値は、渡されたthread_arg->noのアドレスを(void *)にキャストしたもの・・・。
(戻り値が(void *)になっているため、これにキャストしないといけない・・・。)

(void *)型のこういうものを用意して、

pthread_joinの第2引数に渡すと、終了コードを指すアドレスが入るので、(int *)にキャストして参照すると、終了コードが取得できる・・・。

$ ./pthread_join
i = 1, no = 3, message = No.3
i = 1, no = 4, message = No.4
i = 1, no = 2, message = No.2
i = 1, no = 1, message = No.1
i = 1, no = 0, message = No.0
i = 2, no = 4, message = No.4
i = 2, no = 3, message = No.3
i = 2, no = 2, message = No.2
i = 2, no = 1, message = No.1
i = 2, no = 0, message = No.0
i = 3, no = 4, message = No.4
i = 3, no = 3, message = No.3
i = 3, no = 2, message = No.2
i = 3, no = 1, message = No.1
i = 3, no = 0, message = No.0
i = 4, no = 3, message = No.3
i = 4, no = 4, message = No.4
i = 4, no = 2, message = No.2
i = 4, no = 1, message = No.1
i = 4, no = 0, message = No.0
i = 5, no = 4, message = No.4
i = 5, no = 3, message = No.3
i = 5, no = 2, message = No.2
i = 5, no = 1, message = No.1
i = 5, no = 0, message = No.0
return_code[0] = 0
return_code[1] = 1
return_code[2] = 2
return_code[3] = 3
return_code[4] = 4
$

スレッド番号(i == thread_arg[i].no)の値と終了コードの値が等しいので、ちゃんとスレッドの終了コードが取れてるのがわかる・・・。

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