pthread_exit/pthread_kill之后局部对象之析构

摘要:
}intmain(){pthread_tthread;pthread_create;sleep;printf;pthread _cancel;sleep[ tsecer@Harrypthreadexit]$makeg++main.c-lpthread-omain。exe lpthread[tsecer@Harrypthreadexit]$./main。exewillingsleepkillingworker在~dest[tsecer@Harrypthreadexit]$3。结果显示,当线程被终止时,它仍然顽强地执行worker函数中局部变量destmylocal的析构函数。实际上,它是确保项目完整性的重要基础。事实上,对于C++代码,这种语言特性的保证也是实现pthread_cleanup_push/ppthread_cleanup_pop的C++实现基础。

一、多线程与析构函数
这个是在C++编码中可能存在的一个问题,假设说一个线程执行了局部变量的构造函数之后,没有退出局部对象作用域之前,它主动退出线程(pthread_exit)或者被动退出线程(pthread_kill ed),那么这个局部变量的析构函数是否会执行?这个问题对于通常的程序来说影响并不大,但是对于某些依赖在析构函数中执行复杂的系统级对象操作来说是比较重要的(例如释放系统级的信号量,写文件等),并且现在的C库pthread_cleanup_XXX函数实现也依赖于这个特性,所以这里简单单独描述一些。
二、测试代码
[tsecer@Harry pthreadexit]$ ls
main.c  Makefile
[tsecer@Harry pthreadexit]$ cat Makefile 
default:
    g++ main.c -lpthread -o main.exe -lpthread
[tsecer@Harry pthreadexit]$ cat main.c 
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

struct dest {
~dest(){printf("in %s ",__FUNCTION__);}
}
;
void * worker(void * arg)
{
    dest mylocal;当线程被pthread_kill的时候,注意这个局部变量的析构函数是否会被执行
    printf("willing sleep ");
    sleep(1000);
    printf("after sleep 1000 ");注意这个打印是否能够打印出来
}
int main()
{
    pthread_t thread;
    pthread_create(&thread,NULL,worker,NULL);
    sleep(2);
    printf("killing worker ");
    pthread_cancel(thread);
    sleep(2);
}
[tsecer@Harry pthreadexit]$ make
g++ main.c -lpthread -o main.exe -lpthread
[tsecer@Harry pthreadexit]$ ./main.exe 
willing sleep 
killing worker
in ~dest
[tsecer@Harry pthreadexit]$ 
三、结果
可以看到,当线程被杀死的时候,它依然顽强的执行了worker函数中局部变量 dest mylocal的析构函数(并且只执行了析构函数,紧邻着sleep之后的print结构并没有打印出来)。
从效果上看,它是保证程序完整性的重要基础,事实上,对于C++代码,这个语言特征的保证也是实现pthread_cleanup_push/pthread_cleanup_pop的C++实现基础。
从编译器实现上看,编译器代码增加了大量的eh_frame内容,其中使用到了DWARFS结构中的CIE及FDE等信息,这些信息是调试器进行堆栈回溯、函数局部变量显示、栈帧寄存器显示的基础。这个结构比较复杂,如果展开可以展开很多内容。我也是大致看了个基本原理,很多东西不能自由展开,这里就不再深入了。
大家知道这个C++语言特征,并且知道它的实现基础是基于DWARFS格式就可以了。事实上,我们从代码中看不到任何cleanup信息,所以如果有同学有时间有兴趣了解它的实现基础的话,可以向这个方向关注一下。

免责声明:文章转载自《pthread_exit/pthread_kill之后局部对象之析构》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C语言基于GTK+Libvlc实现的简易视频播放器(二)android 功耗(1)---android 功耗分析方法和优化下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Thread.setDaemon设置说明

转载地址:http://blog.csdn.net/m13666368773/article/details/7245570 Thread.setDaemon的用法,经过学习以后了解: 1. setDaemon需要在start方法调用之前使用 2. 线程划分为用户线程和后台(daemon)进程,setDaemon将线程设置为后台进程 3....

性能测试三十二:监控之Java线程监控

线程的五种状态* 新建:new* 运行:runnable* 等待:waitting(无限期等待),timed waitting(限期等待)* 阻塞:blocked* 结束:terminated 线程的两种监控方法一,jvisualvm,图形界面的方式监控之前先对jvm加监控参数,在tomcat的bin目录下,catalina.sh文件中,第二行添加:JA...

浅谈volatile与automicInteger

在并发环境中有三个因素需要慎重考量,原子性、可见性、有序性。   voatile 保证了有序性(防止指令冲排序)和变量的内存可见性(每次都强制取主存数据),每次取到volatile变量一定是最新的   volatile主要用于解决可见性,它修饰变量,相当于对当前语句前后加上了“内存栅栏”。使当前代码之前的代码不会被重排到当前代码之后,当 前代码之后的指令不...

IP address could not be resolved: Name or service not known

[root@test ~]# /usr/local/mysql/bin/mysqld2018-08-05T07:00:33.647509Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links (or equivalent) is the...

HTML5触屏版多线程渲染模板技术分享

  前言: 了解js编译原理的屌丝们都知道,js是单线程的,想当年各路神仙为了实现js的多线程,为了解决innerHTML输出大段HTML卡页面的顽疾,纷纷设计了诸如假冒的“多线程“实现,我自己也在写开源框架KitJs时候,写过类似的组件http://www.cnblogs.com/xueduanyang/archive/2012/05/30/252642...

响应式编程系列(一):什么是响应式编程?reactor入门

响应式编程 系列文章目录 (一)什么是响应式编程?reactor入门 (二)Flux入门学习:流的概念,特性和基本操作 (三)Flux深入学习:流的高级特性和进阶用法 (四)reactor-core响应式api如何测试和调试? (五)Spring reactive: Spring WebFlux的使用 (六)Spring reactive: webClie...