【Linux学习】pthread_create主线程与创建的新线程之间退出关系

转载 2013年12月05日 16:53:13

我们在一个线程中经常会创建另外的新线程,如果主线程退出,会不会影响它所创建的新线程呢?下面就来讨论一下。

 

1、  主线程等待新线程先结束退出,主线程后退出。正常执行。

实例代码:

  1. #include "apue.h"  
  2. #include <pthread.h>  
  3.   
  4. pthread_t ntid;//线程ID  
  5.   
  6. void printids(const char *s)  
  7. {  
  8.         pid_t pid;  
  9.         pthread_t tid;  
  10.         pid = getpid();  
  11.         tid = pthread_self();  
  12.         printf("%s pid %u tid %u (0x%x)\n",s,(unsigned int)pid,  
  13.                         (unsigned int)tid,(unsigned int)tid);  
  14. }  
  15.   
  16. void *thrfun(void *arg){  
  17.         //sleep(1);//使得主线程先退出  
  18.         printids("new thread");  
  19.   
  20.         return ((void *)0);  
  21. }  
  22.   
  23. int main(){  
  24.         int err;  
  25.         err = pthread_create(&ntid,NULL,thrfun,NULL);  
  26.   
  27.         if(err != 0)  
  28.                 err_quit("can't create thread: %s\n",strerror(err));  
  29.         printids("main thread");  
  30.   
  31.         sleep(1);//等待新线程先结束  
  32.   
  33.         exit(0);  
  34. }  
运行结果:


2、  进程先退出,新线程也会立即退出,系统清除所有资源。

实例代码:

  1. #include "apue.h"  
  2. #include <pthread.h>  
  3.   
  4. pthread_t ntid;//线程ID  
  5.   
  6. void printids(const char *s)  
  7. {  
  8.         pid_t pid;  
  9.         pthread_t tid;  
  10.         pid = getpid();  
  11.         tid = pthread_self();  
  12.         printf("%s pid %u tid %u (0x%x)\n",s,(unsigned int)pid,  
  13.                         (unsigned int)tid,(unsigned int)tid);  
  14. }  
  15.   
  16. void *thrfun(void *arg){  
  17.         sleep(1);//使得主线程先退出  
  18.         printids("new thread");  
  19.   
  20.         return ((void *)0);  
  21. }  
  22.   
  23. int main(){  
  24.         int err;  
  25.         err = pthread_create(&ntid,NULL,thrfun,NULL);  
  26.   
  27.         if(err != 0)  
  28.                 err_quit("can't create thread: %s\n",strerror(err));  
  29.         printids("main thread");  
  30.   
  31.         //sleep(1);  
  32.   
  33.         exit(0);//注意是进程(不是线程)退出  
  34. }  

运行结果:


可以发现主线程退出后所创建的新线程也停止运行了。


3、如果主线程调用了pthread_exit,那么它退出了,子线程也不会退出。

实例代码:

  1. #include "apue.h"  
  2. #include <pthread.h>  
  3.   
  4. pthread_t ntid;//线程ID  
  5.   
  6. void printids(const char *s)  
  7. {  
  8.         pid_t pid;  
  9.         pthread_t tid;  
  10.         pid = getpid();  
  11.         tid = pthread_self();  
  12.         printf("%s pid %u tid %u (0x%x)\n",s,(unsigned int)pid,  
  13.                         (unsigned int)tid,(unsigned int)tid);  
  14. }  
  15.   
  16. void *thrfun(void *arg){  
  17.         sleep(1);//使得主线程先退出  
  18.         printids("new thread");  
  19.   
  20.         return ((void *)0);  
  21. }  
  22.   
  23. int main(){  
  24.         int err;  
  25.         err = pthread_create(&ntid,NULL,thrfun,NULL);  
  26.   
  27.         if(err != 0)  
  28.                 err_quit("can't create thread: %s\n",strerror(err));  
  29.         printids("main thread");  
  30.   
  31.         //sleep(1);  
  32.   
  33.             pthread_exit(NULL);  
  34.   
  35.         exit(0);  
  36. }  
运行结果:



POSIX标准定义:

When you program with POSIX Threads API,there is one thing about pthread_exit() that you may ignore for mistake. Insubroutines that complete normally, there is nothing special you have to dounless you want to pass a return code back using pthread_exit(). The completionwon't affect the other threads which were created by the main thread of thissubroutine. However, in main(), when the code has been executed to the end,there could leave a choice for you. If you want to kill all the threads thatmain() created before, you can dispense with calling any functions. But if you want to keep the process and all the other threadsexcept for the main thread alive after the exit of main(), then you can call pthread_exit()to realize it. And any files opened inside the main thread will remain openafter its termination.

 

按照POSIX标准定义,当主线程在子线程终止之前调用pthread_exit()时,子线程是不会退出的。

 

注意:这里在main函数中调用pthread_exit()只会是主线程退出,而进程并未退出。因此新线程继续执行而没有退出。

我们可以在return 0;这条语句前面添加一条输出语句printf(“Mainthread has exited!\n”);来进行测试,输出结果不发生任何变化,说明这条语句没有被执行到。也就说明进程并未退出。

 

因此:

一个线程的退出不会影响另外一个线程。但是进程结束,所有线程也就结束了,所有资源会被回收。

 

我们可以再写一个程序来进行验证:

4、在创建的新线程B中再次创建新线程C,那么如果B先退出,那么C将会继续执行而不会退出。

实例代码:

  1. #include "apue.h"  
  2. #include<pthread.h>  
  3.   
  4. pthread_t ntid;//线程ID  
  5.   
  6. void printids(const char *s)  
  7. {  
  8.         pid_t pid;  
  9.         pthread_t tid;  
  10.         pid = getpid();  
  11.         tid = pthread_self();  
  12.         printf("%s pid %u tid %u (0x%x)\n",s,(unsigned int)pid,  
  13.                        (unsigned int)tid,(unsigned int)tid);  
  14. }  
  15.   
  16.   
  17. void *thrfun2(void *arg){  
  18.         sleep(1);//使得创建它的主线程先退出  
  19.         printids("new thread of the new thread");  
  20.   
  21.         return ((void *)0);  
  22. }  
  23.   
  24. void *thrfun(void *arg){  
  25.         sleep(1);//使得主线程先退出  
  26.         printids("new thread");  
  27.         int err;  
  28.         err = pthread_create(&ntid,NULL,thrfun2,NULL);  
  29.   
  30.         if(err != 0)  
  31.                 err_quit("can'tcreate thread: %s\n",strerror(err));  
  32.   
  33.         return ((void *)0);  
  34. }  
  35.   
  36. int main(){  
  37.         int err;  
  38.         err = pthread_create(&ntid,NULL,thrfun,NULL);  
  39.   
  40.         if(err != 0)  
  41.                 err_quit("can'tcreate thread: %s\n",strerror(err));  
  42.         printids("main thread");  
  43.   
  44.         //sleep(1);  
  45.   
  46.         pthread_exit(NULL);  
  47.   
  48.         printf("main thread has exited!\n");  
  49.   
  50.         exit(0);  
  51. }  

运行结果:



转载地址:http://blog.csdn.net/xiajun07061225/article/details/8976850


【Linux学习】pthread_create主线程与创建的新线程之间退出关系

【Linux学习】pthread_create主线程与创建的新线程之间退出关系
  • gyy823
  • gyy823
  • 2016年12月05日 10:50
  • 561

【Linux学习】pthread_create主线程与创建的新线程之间退出关系

我们在一个线程中经常会创建另外的新线程,如果主线程退出,会不会影响它所创建的新线程呢?下面就来讨论一下。   1、  主线程等待新线程先结束退出,主线程后退出。正常执行。 实例代码: #inc...
  • xiajun07061225
  • xiajun07061225
  • 2013年05月26日 16:21
  • 17830

pthread_create主线程与创建的新线程之间退出关系

原文地址:http://blog.csdn.net/xiajun07061225/article/details/8976850 我们在一个线程中经常会创建另外的新线程,如果主线程退出,会不...
  • lenchio
  • lenchio
  • 2014年02月09日 16:01
  • 1420

linux c之使用pthread_create创建线程pthread_join等待线程和pthread_exit终止线程总结

1、介绍API 1、pthread_create函数 函数简介 pthread_create是UNIX环境创建线程函数 头文件 #include 函数声明 int pthread_create(pt...
  • u011068702
  • u011068702
  • 2017年03月06日 21:33
  • 1265

pthread_create()创建线程最大个数

线程应用程序最常见导致创建线程失败的原因是线程栈大小的设置。创建一个新的线程,默认情况下系统为线程栈预留了2MB的寻址空间。线程栈起始于进程虚拟 内存的高端地址,并向虚拟内存底端地址方向扩展。取决于线...
  • maopig
  • maopig
  • 2016年08月20日 16:00
  • 4709

linux 线程创建 pthread_create函数 获取线程id

函数原型: #include int  pthread_create(pthread_t*thread,pthread_attr_t   *attr, void * (*start_routin...
  • Z_Dream_ST
  • Z_Dream_ST
  • 2017年11月30日 22:06
  • 280

clone的fork与pthread_create创建线程有何不同&pthread多线程编程的学习小结

进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合,这些资源在Linux中被抽 象成各种数据对象:进程控制块、虚存空间、文件系统,文件I/O、信号处理函数。所以创建一个进程的 过程就...
  • rock_joker
  • rock_joker
  • 2017年05月25日 09:32
  • 836

初识pthread(一)-线程管理之创建/结束线程

进阶的线程学习---pthread!
  • tianyuan521521
  • tianyuan521521
  • 2015年02月24日 23:23
  • 473

pthread_create()给创建的线程传递参数

对于pthread_create为创建线程传递参数的问题,先前只知道传递单个参数的方法,现在需要传递多个参数。     对于新手的我比较纠结,因此,上网查找资料,发现CU里面的一个帖...
  • jisuanji_wjfioj
  • jisuanji_wjfioj
  • 2014年09月04日 09:45
  • 1373

线程创建 pthread_create 中自定义参数注意事项

1. 函数原型 int pthread_create(pthread_t thread, const pthread_attr_t attr,          void (start_rou...
  • chinaeran
  • chinaeran
  • 2017年02月10日 18:34
  • 848
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Linux学习】pthread_create主线程与创建的新线程之间退出关系
举报原因:
原因补充:

(最多只允许输入30个字)