Linuxでpthread_detach()スレッド注意
3335 ワード
一、分離スレッドの作成
分離スレッドを作成するには、次の2つの方法があります.
(1)スレッド作成時にその属性を分離状態(detached)にする.
(2)スレッド作成後にその属性を分離(detached)に設定する.
二、分離スレッドの役割
スレッドが占有するリソースをシステムによって回収します.
三、実例
ここでthread 1スレッドは「デッドループ」であり、thread 1スレッドは「分離スレッド」である.
では、メインスレッドが終了した後、thread 1スレッドはずっと実行されているのではないでしょうか.
プログラム出力:
[root@robot ~]# gcc thread_detach.c -lpthread[root@robot ~]# ./a.outthread1 running...!thread1 running...!thread1 running...!thread1 running...!thread1 running...!thread1 running...!thread1 running...!thread1 running...!thread1 running...!Leave main thread![root@robot ~]#
メインスレッドが終了した後もthread 1スレッドが終了していることがわかります.
注意:「スレッドを分離」は「分離」されたものではなく、プライマリ・スレッドとは少しも関係なく、プライマリ・スレッドは終了し、「スレッドを分離」は同じように終了します.ただ「スレッドを分離」したリソースはシステムで回収されています.
四、結論
プロセスメイン関数(main()でpthread_を呼び出すexit()は、メイン関数が存在するスレッド(プロセスのメインスレッドと言える)のみを終了させる.
一方、returnの場合、コンパイラは、_exit()などのプロセス終了コードを呼び出し、プロセスとそのすべてのスレッド(分離スレッドを含む)が実行を終了します.
分離スレッドを作成するには、次の2つの方法があります.
(1)スレッド作成時にその属性を分離状態(detached)にする.
(2)スレッド作成後にその属性を分離(detached)に設定する.
二、分離スレッドの役割
スレッドが占有するリソースをシステムによって回収します.
三、実例
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <semaphore.h>
#include <sys/types.h>
#include <dirent.h>
#include <pthread.h>
#include <errno.h>
#include <signal.h>
#include <time.h>
void* thread1(void *arg)
{
while (1)
{
usleep(100 * 1000);
printf("thread1 running...!
");
}
printf("Leave thread1!
");
return NULL;
}
int main(int argc, char** argv)
{
pthread_t tid;
pthread_create(&tid, NULL, (void*)thread1, NULL);
pthread_detach(tid); // sleep(1);
printf("Leave main thread!
");
return 0;
}
ここでthread 1スレッドは「デッドループ」であり、thread 1スレッドは「分離スレッド」である.
では、メインスレッドが終了した後、thread 1スレッドはずっと実行されているのではないでしょうか.
プログラム出力:
[root@robot ~]# gcc thread_detach.c -lpthread[root@robot ~]# ./a.outthread1 running...!thread1 running...!thread1 running...!thread1 running...!thread1 running...!thread1 running...!thread1 running...!thread1 running...!thread1 running...!Leave main thread![root@robot ~]#
メインスレッドが終了した後もthread 1スレッドが終了していることがわかります.
注意:「スレッドを分離」は「分離」されたものではなく、プライマリ・スレッドとは少しも関係なく、プライマリ・スレッドは終了し、「スレッドを分離」は同じように終了します.ただ「スレッドを分離」したリソースはシステムで回収されています.
四、結論
プロセスメイン関数(main()でpthread_を呼び出すexit()は、メイン関数が存在するスレッド(プロセスのメインスレッドと言える)のみを終了させる.
一方、returnの場合、コンパイラは、_exit()などのプロセス終了コードを呼び出し、プロセスとそのすべてのスレッド(分離スレッドを含む)が実行を終了します.