pthread_join() の第2引数の値を参照するサンプル

はじめに

pthread_join()の第2引数の値をうまく参照することができなかった。最終的にはうまくできたが、そのときに作成したサンプルを示す。

サンプル

下記にサンプル一式のURLとメインソースを示す。

サンプル一式

tomohikoseven/pthread_join

メインソース

(main.c)
#include
#include
#include
#include

int
test( )
{
return 2;
}

int
main( )
{
pthread_t th_num;
int ret;
void* thread_return;

ret = pthread_create( &th_num, NULL, ( void* )test, NULL );
if( 0 != ret )
{
printf( "pthread_create error.\n" );
exit( 1 );
}
ret = pthread_join( th_num, &thread_return );
if( 0 != ret )
{
printf( "pthread_join error.\n" );
exit( 1 );
}

printf( "thread_return:%p\n", thread_return );

return 0;
}

実行結果を下記に示す。

andre@andre-VirtualBox:~/work/c/pthread_join$ ./main
thread_return:0x2

考察

ここで問題となるのは、void* 。
void* 変数内に、戻り値が格納されているポインタアドレスが入っているのかと思ったら、
void* 変数内のデータそのものが戻り値だった。

void* は汎用ポインタであるという説明が各所にある。
ポインタ=アドレス という認識があったので、*(変数) で値を出力(printf)しようとしたら、不正な場所を参照して、Segv していた。
void* が汎用ポインタであるという認識を改めて、void* はサイズ 4バイト(32bitの場合)で、16進数データが入っているものとする。