线程的资源回收:pthread_detach与pthread_cleanup_push/pthread_cleanup_pop的组合
2023-12-15 05:00:40
线程退出
单个线程可以通过3种方式退出,因此可以在不终止整个进程的情况下,停止它的控制流。
1)线程可以简单地执行完后结束,返回值是线程的退出码。
2)线程可以被同一进程中的其他线程用pthread_cancel所取消。
3)线程调用pthread_exit。
线程退出时需要回收资源,一方面回收线程本身的资源,另一方面还需要回收线程使用的特殊资源,例如互斥锁(回收互斥锁,也就是解锁),malloc开辟的空间。
线程资源pthread_detach与pthread_cleanup_push/pthread_cleanup_pop的组合的回收模板:
/*创建线程*/
pthread_create(&threadID, NULL, cam_thread, in);/*in会传给cam_thread*/
pthread_detach(pctx->threadID);/*即主线程与子线程分离,两者相互不干涉,子线程结束同时子线程的资源自动回收。*/
/*cam_thread的函数实现*/
void cam_thread(){
pthread_cleanup_push(cleanup, NULL);
/*do some work*/
if (某些函数的返回值出现异常,比如打开某文件失败)
{
goto endloop;
}
endloop: /*就算没有出现异常 最终也要通过指令跳转到endloop*/
pthread_cleanup_pop(1);
return NULL; /*执行完return之后,线程自然退出,此时由于是分离线程,线程自动完成本身资源回收*/
}
void cleanup(void *arg)
{
input * in = (input*)arg;
context *pctx = (context*)in->context;
IPRINT("cleaning up resources allocated by input thread\n");
if (pctx->videoIn != NULL) {
close_v4l2(pctx->videoIn);
free(pctx->videoIn->tmpbuffer);
free(pctx->videoIn);
pctx->videoIn = NULL;
}
free(in->buf);
in->buf = NULL;
in->size = 0;
}
/* !!!!! */
/*值得注意是 如果遇到ctrl+c 需要在main里面加入 signal (SIGINT, ReleaseResource);
进行一些资源的释放*/
!!!!!?
值得注意是 ?如果遇到ctrl+c 需要在main里面加入 signal (SIGINT, ReleaseResource); ?
进行一些资源的释放
参考文章:
1:Linux线程的创建与回收_linux线程自己跑完会释放吗-CSDN博客
补充上述文章:
回收线程?pthread_join 阻塞函数? ?pthread_tryjoin_np 非阻塞函数;
2:pthread_cleanup_push()/pthread_cleanup_pop()的详解-CSDN博客
Linux 线程控制 —— 线程清理 pthread_cleanup_push-CSDN博客
注意 :?pthread_cleanup_push/pthread_cleanup_pop 如果使用exit 或cancel 退出,pthread_cleanup_pop() 的参数要选为0
文章来源:https://blog.csdn.net/symsyq/article/details/134992666
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!