メインスレッドで2つのスレッドを起動するつもりです。メインスレッドは、2つの子スレッドがすべて終了するまで待機する必要があります。これが私の方法です。
void *routine(void *arg)
{
sleep(3);
}
int main()
{
for (int i = 0; i < 2; i++) {
pthread_t tid;
pthread_create(&tid, NULL, routine, NULL);
pthread_join(&tid, NULL); //This function will block main thread, right?
}
}
上記のコードでは、pthread_join
はメインスレッドに子スレッドを待機させますが、問題は、最初のスレッドが終了するまで2番目のスレッドが作成されないことです。これは私が望むものではありません。
私が望むのは、2つのスレッドがメインスレッドで即座に作成され、メインスレッドが終了するまで待機することです。のように思える pthread_join
トリックをすることはできません、できますか?
多分semaphore
を介して、私は仕事をすることができると思いましたが、他の方法はありますか?
int main()
{
pthread_t tid[2];
for (int i = 0; i < 2; i++) {
pthread_create(&tid[i], NULL, routine, NULL);
}
for (int i = 0; i < 2; i++)
pthread_join(tid[i], NULL);
return 0;
}
最初にすべてのスレッドを作成してから、それらすべてを結合します。
pthread_t tid[2];
/// create all threads
for (int i = 0; i < 2; i++) {
pthread_create(&tid[i], NULL, routine, NULL);
}
/// wait all threads by joining them
for (int i = 0; i < 2; i++) {
pthread_join(tid[i], NULL);
}
または、pthread_attr_t
変数を用意し、 pthread_attr_init(3) を使用してから pthread_attr_setdetachedstate(3) を使用し、そのアドレスを pthread_create(3 ) 2番目の引数。 Thosはdetached状態でスレッドを作成します。または Jxhの答え で説明されているようにpthread_detach
を使用します。
スレッドを切り離して開始することができ、参加する心配はありません。
for (int i = 0; i < 2; i++) {
pthread_t tid;
pthread_create(&tid, NULL, routine, NULL);
pthread_detach(tid);
}
pthread_exit(0);
または、別の方法として、死んだスレッドがメインスレッドに報告して、スレッドを作成した順序ではなく、終了した順序で結合することもできます。
void *routine(void *arg)
{
int *fds = (int *)arg;
pthread_t t = pthread_self();
usleep((Rand()/(1.0 + Rand_MAX)) * 1000000);
write(fds[1], &t, sizeof(t));
}
int main()
{
int fds[2];
srand(time(0));
pipe(fds);
for (int i = 0; i < 2; i++) {
pthread_t tid;
pthread_create(&tid, NULL, routine, fds);
printf("created: %llu\n", (unsigned long long)tid);
}
for (int i = 0; i < 2; i++) {
pthread_t tid;
read(fds[0], &tid, sizeof(tid));
printf("joining: %llu\n", (unsigned long long)tid);
pthread_join(tid, 0);
}
pthread_exit(0);
}