博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UNIX环境高级编程——主线程与子线程的退出关系
阅读量:6432 次
发布时间:2019-06-23

本文共 5182 字,大约阅读时间需要 17 分钟。

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

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

示例代码:

#include 
#include
#include
#include
#include
pthread_t ntid;//线程IDvoid printids(const char *s){ pid_t pid; pthread_t tid; pid = getpid(); tid = pthread_self(); printf("%s pid %u tid %u (0x%x)\n",s,(unsigned int)pid, (unsigned int)tid,(unsigned int)tid);}void *thrfun(void *arg){ //sleep(1);//使得主线程先退出 printids("new thread"); return ((void *)0);}int main(){ int err; err = pthread_create(&ntid,NULL,thrfun,NULL); if(err != 0) perror("pthread_create"); printids("main thread"); sleep(1);//等待新线程先结束 exit(0);}
运行结果:

huangcheng@ubuntu:~$ ./a.outmain thread pid 2344 tid 3077813952 (0xb773b6c0)new thread pid 2344 tid 3077811056 (0xb773ab70)
2、  进程先退出,新线程也会立即退出,系统清除所有资源。

示例代码:

#include 
#include
#include
#include
#include
pthread_t ntid;//线程IDvoid printids(const char *s){ pid_t pid; pthread_t tid; pid = getpid(); tid = pthread_self(); printf("%s pid %u tid %u (0x%x)\n",s,(unsigned int)pid, (unsigned int)tid,(unsigned int)tid);}void *thrfun(void *arg){ sleep(1);//使得主线程先退出 printids("new thread"); return ((void *)0);}int main(){ int err; err = pthread_create(&ntid,NULL,thrfun,NULL); if(err != 0) perror("pthread_create"); printids("main thread"); //sleep(1);//等待新线程先结束 exit(0);}
运行结果:

huangcheng@ubuntu:~$ ./a.outmain thread pid 2366 tid 3077641920 (0xb77116c0)
可以发现主线程退出后所创建的新线程也停止运行了。

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

示例代码:

#include 
#include
#include
#include
#include
pthread_t ntid;//线程IDvoid printids(const char *s){ pid_t pid; pthread_t tid; pid = getpid(); tid = pthread_self(); printf("%s pid %u tid %u (0x%x)\n",s,(unsigned int)pid, (unsigned int)tid,(unsigned int)tid);}void *thrfun(void *arg){ sleep(1);//使得主线程先退出 printids("new thread"); return ((void *)0);}int main(){ int err; err = pthread_create(&ntid,NULL,thrfun,NULL); if(err != 0) perror("pthread_create"); printids("main thread"); //sleep(1);//等待新线程先结束 pthread_exit(NULL); // exit(0);}
运行结果:

huangcheng@ubuntu:~$ ./a.outmain thread pid 2385 tid 3077768896 (0xb77306c0)new thread pid 2385 tid 3077766000 (0xb772fb70)

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将会继续执行而不会退出。

示例代码:

#include 
#include
#include
#include
#include
pthread_t ntid;//线程IDvoid printids(const char *s){ pid_t pid; pthread_t tid; pid = getpid(); tid = pthread_self(); printf("%s pid %u tid %u (0x%x)\n",s,(unsigned int)pid, (unsigned int)tid,(unsigned int)tid);}void *thrfun2(void *arg){ sleep(1);//使得创建它的主线程先退出 printids("new thread of the new thread"); return ((void *)0);}void *thrfun(void *arg){ sleep(1);//使得主线程先退出 printids("new thread"); int err; err = pthread_create(&ntid,NULL,thrfun2,NULL); if(err != 0) perror("pthread_create"); return ((void *)0);}int main(){ int err; err = pthread_create(&ntid,NULL,thrfun,NULL); if(err != 0) perror("pthread_create"); printids("main thread"); //sleep(1); pthread_exit(NULL);}
运行结果:

huangcheng@ubuntu:~$ ./a.outmain thread pid 2413 tid 3077912256 (0xb77536c0)new thread pid 2413 tid 3077909360 (0xb7752b70)new thread of the new thread pid 2413 tid 3069516656 (0xb6f51b70)

转载于:https://www.cnblogs.com/hehehaha/p/6332654.html

你可能感兴趣的文章
面试官问:ZooKeeper 一致性协议 ZAB 原理
查看>>
DNS实现域名正解与反解
查看>>
反向教学系列之——Django入门(一)【不需知道web框架】
查看>>
Linux学习-标准输入输出
查看>>
CentOS 7 配置IP
查看>>
文本处理工具grep及正则表达式
查看>>
Intel VT-x处于禁用状态
查看>>
用什么软件可以修改PDF文件,软件的操作方法
查看>>
如何精简企业主数据“裹脚布”
查看>>
Pointer on C
查看>>
& 号和管道符号(|)在不同场景下的使用方法
查看>>
curl 浏览器模拟请求实战
查看>>
多个VLAN中的vrrp备份组配置举例
查看>>
运维自动化之使用PHP+MYSQL+SHELL打造私有监控系统(六)
查看>>
interlib在tomcat7.0的安装
查看>>
水晶报表在大型WEB内部管理系统里的滑铁卢
查看>>
我的友情链接
查看>>
Git学习
查看>>
trove 基于 centos7 制作 mysql5.6 镜像
查看>>
结合i节点和数据块分析linux中软链接和硬链接的区别
查看>>