スレッドの終了と待ち合わせ
from Pthreads
スレッドの終了と待ち合わせ
code:2_2_1_1_pthreads_1.c
#include <pthread.h> // <1>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#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[]) {
pthread_t vNUM_THREADS; // <5>
// スレッド生成 <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>
Pthreadsではスレッド用の関数の型は、void*型の値を受け取り、void*型をリターンする必要がある
argはスレッド生成時に渡される引数であり、void*型となる。
そのため、ここでvoid*型からint型にキャストしている。
<4>
スレッド関数が行うメイン処理
<5>
スレッド用のハンドラを保存する配列を定義。
スレットを生成すると、pthread_tという型の値に情報が保存され、その値への操作がスレッドへの操作となる
<6>
NUM_THREADSの数だけスレッドを生成。
スレッドの実際の生成は、pthread_create関数を呼び出して行う。
pthread_createの引数
第一引数に、pthread_t型のポインタを受け取る
第二引数に、スレッドの特徴を示すアトリビュートを受け取る
ここではNULLを渡すことでデフォルトのアトリビュートを渡してる
第三引数に、スレッド生成用の関数を受け取る
第四引数に、第三引数で渡した関数の引数を受け取る。
<7>
スレッド終了の待機コード。
スレッド終了の待機は、pthread_join関数で行う。
スレッドの待機を一般的にjoinするなどということもある