私は2つのスレッドを生成する非常に小さなプログラムを書いた。
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
void *start()
{
printf("Am a new thread!\n");
printf("%d\n",pthread_self());
}
void main()
{
pthread_t thread_id1;
pthread_t thread_id2;
pthread_create(&thread_id1,NULL,start,NULL);
pthread_create(&thread_id2,NULL,start,NULL);
//pthread_join(thread_id,NULL);
sleep(30);
}
プログラムをコンパイルして実行するとき:
gcc create.c -lpthread
./a.out
新しい端末を開いてスレッドを見ようとしたところ、次のような結果が出ました。
ps -efL | grep a.out
root 1943 20158 1943 0 1 15:25 pts/4 00:00:00 ./a.out
root 1985 1889 1985 0 1 15:25 pts/5 00:00:00 grep --color=auto a.out
それでは、ここに2つのスレッドIDが表示されないのはなぜですか?
答え1
2つの追加スレッドがメッセージを作成して終了するため、これを見る時間はありませんps
。
新しいスレッドは、次のいずれかの方法で終了します。
* pthread_join(3) を呼び出した同じプロセスの他のスレッドで使用できる終了状態値を指定して pthread_exit(3) を呼び出します。
* start_routine() から返されます。。これは、returnステートメントに指定された値でpthread_exit(3)を呼び出すのと同じです。
[...]
次の方法で何が起こっているのかを追跡できますstrace
。
$ strace -f -e trace=clone,exit ./a.out
clone(strace: Process 409 attached
child_stack=0x7f7126930ff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7f71269319d0, tls=0x7f7126931700, child_tidptr=0x7f71269319d0) = 409
[pid 408] clone(strace: Process 410 attached
child_stack=0x7f712612fff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7f71261309d0, tls=0x7f7126130700, child_tidptr=0x7f71261309d0) = 410
Am a new thread!
Am a new thread!
647173888
638781184
[pid 409] exit(0 <unfinished ...>
[pid 410] exit(0 <unfinished ...>
[pid 409] <... exit resumed>) = ?
[pid 410] <... exit resumed>) = ?
[pid 410] +++ exited with 0 +++
[pid 409] +++ exited with 0 +++