【C语言】【unix c】线程的退出,汇合,分离

四、线程的退出,汇合,分离
    1、线程的退出
        return和exit的区别
            return只是函数的返回,在线程中只是代表线程的结束,而exit代表进程的结束,进程中的所有线程都终止
            线程的处理函数中不要用exit
        pthread_exit(3)
            使用函数pthread_exit(3)来终止一个线程
                #include <pthread.h>
                void pthread_exit(void *retval);
                    功能:终止当前线程:
                    参数:
                        retval:指定传递给另一个线程的的值,那个线程调用pthread_join(3)接受这个值
                    返回值:不返回给调用者
                    注意: Compile and link with -pthread.

            void *doit(void *arg) {//u是无符号的
                printf("pid:%d\ttid:%lu\t%s\n",getpid(),pthread_self(),(char*)arg);
                //return NULL;
                pthread_exit((void *-1);
            }

        pthread_cancel(3):
            #include <pthread.h>
            int pthread_cancel(pthread_t thread);
                功能:给线程发送一个取消请求,执行中间进行取消,终止函数是在线程程序里面的,这个是在其他线程的
                参数:
                    thread:指定了线程的id
                返回值: 0 成功
                    非0 错误码
                注意: 使用pthread_cancel(3)终止的进程,再使用pthread_join(3)获取线程退出信息的时候,获取到的是PTHREAD_CANCELED

    2、线程的汇合:
        thread_join(3)
        #include <pthread.h>

               int pthread_join(pthread_t thread, void **retval);
            功能:汇合终止的进程
            参数:
        thread:指定了等待汇合的线程的id
        **retval:线程结束的返回码
            返回值:0 成功
                错误码 失败
               Compile and link with -pthread.
        举例:线程的退出和汇合 (pthread_e.c)
            #include <stdio.h>
            #include <pthread.h>
            //线程的处理函数
            void *doit(void *arg){
                printf("new thread...\n");
                pthread_exit((void *)1);
            }
            void *doit1(void *arg){
                printf("doit1 thread...\n");
                return ((void *)2);
            }

            void *doit2(void *arg){
                while(1){
                sleep(1);
                printf("doit2 run...\n");
                }
            }
            int main(void){
                pthread_t tid;
                void *retval;
                //创建一个新的线程
                pthread_create(&tid,NULL,doit,NULL);
                //等待新的线程结束汇合
                pthread_join(tid,&retval);
                //打印出线程的退出状态码
                printf("exit code ...%d\n",(int)retval);
                //创建一个新的线程
                pthread_create(&tid,NULL,doit1,NULL);
                //等待新的线程结束汇合
                pthread_join(tid,&retval);
                //打印出线程的退出状态码
                printf("exit code ...%d\n",(int)retval);
                //创建一个新的线程
                pthread_create(&tid,NULL,doit2,NULL);
                sleep(3);
                pthread_cancel(tid);  // 在主线程里将其他线程进行取消,是一次执行完毕后对其进行结束,该函数发送取消成功线程并不一定会结束
                //等待新的线程结束汇合
                pthread_join(tid,&retval);
                if(retval==PTHREAD_CANCELED){
                //打印出线程的退出状态码
                printf("doit2 exit code ...%d\n",\
                    (int)retval);
                }

                return 0;
            }

            tarena@ubuntu:~/day/day36$ gcc pthread_e.c -lpthread
            tarena@ubuntu:~/day/day36$ a.out 
            new thread...
            exit code ...1
            doit1 thread...
            exit code ...2
            doit2 run...
            doit2 run...
            doit2 exit code ...-1


    3、线程的分离
        pthread_detach(3)
        #include <pthread.h>
        int pthread_detach(pthread_t thread);

        功能:分离一个线程
        thread:要分离的进程
        返回值:0 成功
            非零 错误码
        Compile and link with -pthread.
        举例:pthread_d.c

            #include <pthread.h>
            #include <stdio.h>
            void *doit(void *arg){
                printf("arg...\n");
                sleep(1);
                return  NULL;
            }
            int main(void){
                pthread_t tid;
                pthread_create(&tid,NULL,doit,NULL);
                pthread_detach(tid);
            //    sleep(1);
                return 0;
            }

你可能感兴趣的:(c语言,Linux)