Linuxでpthread_detach()スレッド注意

3335 ワード

一、分離スレッドの作成
分離スレッドを作成するには、次の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()などのプロセス終了コードを呼び出し、プロセスとそのすべてのスレッド(分離スレッドを含む)が実行を終了します.