スレッドの終了と待ち合わせ
スレッドの終了と待ち合わせ
code:2_2_1_1_pthreads_1.c
#define NUM_THREADS 10 // 生成するスレッドの数 // スレッド用関数
void *thread_func(void *arg) { // <2>
int id = (int)arg; // <3>
for (int i = 0; i < 5; i++) { // <4>
printf("id = %d, i = %d\n", id, i);
sleep(1);
}
return "finished!"; // 返り値
}
int main(int argc, char *argv[]) {
// スレッド生成 <6>
for (int i = 0; i < NUM_THREADS; i++) {
if (pthread_create(&vi, NULL, thread_func, (void *)i) != 0) { perror("pthread_create");
return -1;
}
}
// スレッドの終了を待機 <7>
for (int i = 0; i < NUM_THREADS; i++) {
char *ptr;
if (pthread_join(vi, (void **)&ptr) == 0) { printf("msg = %s\n", ptr);
} else {
perror("pthread_join");
return -1;
}
}
return 0;
}
<1>
Pthreadsを使う際にはpthrerad.hを読み込む
<2>
スレッド用関数。これが並行に動作する
<3>
<4>
<5>
スレットを生成すると、pthread_tという型の値に情報が保存され、その値への操作がスレッドへの操作となる <6>
NUM_THREADSの数だけスレッドを生成。
スレッドの実際の生成は、pthread_create関数を呼び出して行う。
pthread_createの引数
第一引数に、pthread_t型のポインタを受け取る
第二引数に、スレッドの特徴を示すアトリビュートを受け取る
ここではNULLを渡すことでデフォルトのアトリビュートを渡してる
第三引数に、スレッド生成用の関数を受け取る
第四引数に、第三引数で渡した関数の引数を受け取る。
<7>
スレッド終了の待機コード。
スレッド終了の待機は、pthread_join関数で行う。
スレッドの待機を一般的にjoinするなどということもある