线程退出前的资源释放问题

原创 2018年04月06日 18:24:26

线程退出前的资源释放问题

类似于进程的atexit()函数,线程在退出前也可以执行用户显示定义的一些函数。无论是可预见的线程终止还是异常终止,都会存在资源释放的问题,在不考虑因为运行出错而退出的情况下,如何保证线程终止时能顺利的释放掉自己所占用的资源,特别是锁资源。


资源独占锁的使用:

线程为了访问临界资源而为其加上锁,但在访问过程中被外界取消,如果线程处于响应取消状态,且采用异步方式响应,或者是在打开独占锁以前的运行路径上存在取消点,在该临界资源将永远处于锁定状态得不到释放。外界取消操作是不可遇见的,因此需要一个机制来化简用于资源释放的编程。


函数pthread_clean_push()/pthread_cleanp_pop()用于自动释放资源

pthread_clean_push(),pthread_cleanp_pop()采用先入后出的栈结构来管理

void pthread_clean_push(void (*routine)(void*),void *arg);
void pthread_cleanp_pop(int execute);

//参数void (*routine)(void*)在调用pthread_clean_push()时压入清理函数栈
//execute表示执行到pthread_cleanp_pop()时,
//是否在弹出清理函数的同时执行函数,为0表示不执行;非0为执行。
//这个参数并不影响异常终止时清理函数的执行

触发routine的3种情况:

  1. pthread_exit( );
  2. pthread_cancel( );
  3. cleanup_pop参数1;

下面这个例子展示了上面两个函数的使用,在此程序中,子线程while(1)死循环,而在主线程中使用pthread_cancel()取消线程

这里写图片描述
这里写图片描述
这里写图片描述
我们用了pthread_clean_push(),pthread_cleanp_pop()两个函数,当线程被终止时,可以出栈执行我们之前入栈的函数,进行内存释放

线程的退出与其相关资源的释放

线程是可访问进程资源的独立运行的一系列代码(过程),它使用的资源有两种:1.进程中所有线程共享的资源。2.线程私有的资源。那么如果线程退出的话,第2种资源也就没有存在的意义了。线程退出的方式:1.线程...
  • CharlesPrince
  • CharlesPrince
  • 2009-01-04 15:35:00
  • 13987

线程资源释放 问题解决

一般来说,Posix的线程终止有两种情况:正常终止和非正常终止。线程主动调用pthread_exit()或者从线程函数中return都将使线程正常退出,这是可预见的退出方式;非正常终止是线程在其他线程...
  • vertor11
  • vertor11
  • 2017-02-19 18:18:27
  • 716

Pthread线程的资源的释放

1. 调用pthread_detach(pthread_self()) #include #include #include void print_message( void *ptr ); in...
  • kakaka2011
  • kakaka2011
  • 2014-12-05 14:23:19
  • 3185

pthread_cancel 与内存释放的小技巧

pthread_cancel 与内存释放的小技巧 要学会思考,把问题想清楚了,尽量找到最好的解决方法! 主线程 关闭子线程时pthread_cancel()不能让子线程立即退出,线程继...
  • yuanchunsi
  • yuanchunsi
  • 2016-08-26 17:20:30
  • 900

使用pthread 线程退出时自动释放资源

线程退出时自动释放资源 今天碰到一个问题:主线程pthread_create一个子线程A,子线程pthread_mutex_lock,然后调用其他...
  • echoisland
  • echoisland
  • 2011-09-16 16:42:05
  • 7206

线程终止资源清理方式

Posix线程终止的两种情况 线程终止时的清理 线程终止的同步及其返回值 关于pthread_exit 和return 1.Posix线程终止的两种情况。  包括正常终止和非正常终止。线程主动调用pt...
  • XscKernel
  • XscKernel
  • 2015-08-18 18:21:02
  • 1476

线程结束资源释放

线程创建时,系统会分配给线程一些资源,我们可以看到的就是线程描述符,线程堆栈,在系统内部还会有更复杂的系统维护一些信息,在线程创建时,内核总会为其维护一些资源,比较理想的情况是线程运行结束后,释放系统...
  • mantis_1984
  • mantis_1984
  • 2016-01-13 16:28:28
  • 1007

linux c语言 线程资源释放

最近做了多线程并发网络编程的时候出现了一个问题。程序在运行的过程中,占用的内存会越来越大。起初我怀疑是程序有指针没有被free,导致内存泄漏。后来通过调试才发现, 原来是线程结束之后, 线程的资源没有...
  • qq_25829649
  • qq_25829649
  • 2016-01-30 21:52:56
  • 1521

linux进程退出,线程资源用pthread_detach释放

linux下,用pthread_create创建线程后,线程的默认状态为joinable,如果程序退出,线程没被join,则会有线程的资源没有被释放。 调用pthread_join可以,但是程序会再调...
  • aibao1266
  • aibao1266
  • 2017-08-15 15:16:28
  • 416

关于mfc线程 的退出问题、同步问题

AfxBeginThread()函数的返回值是CWinThread* 指针,但是这个指针不能直接使用,因为这个指针会自动销毁。如果道友直接使用了这个指针,那么当在操作这个指针时,若已被mfc销毁,那么...
  • a2311minghan
  • a2311minghan
  • 2017-02-07 11:12:31
  • 229
收藏助手
不良信息举报
您举报文章:线程退出前的资源释放问题
举报原因:
原因补充:

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