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