Linux多线程基础(2):僵尸线程和资源回收

news2024/9/30 9:22:31

在Linux多线程基础(1)中,我给大家介绍了多线程该如何创建,这一篇文章我们对僵尸进程以及如何回收线程进行讲解.

1.僵尸线程

僵尸线程的产生是因为主线程在子线程结束之前退出,导致子线程的状态无法被回收,从而形成了僵尸线程.

底层原理是线程有joinable(非分离)和unjoinable(分离)两种状态,创建线程时,默认属性是joinable.当线程在主函数终止时调用pthread_exit退出时,不会释放占用的内存资源,导致出现僵尸线程.

为了防止出现僵尸进程,就需要考虑到如何正确的进行资源回收.

1.1如何查看僵尸进程

终端中运行命令ps -el可以查看到系统中的所有进程。如果发现进程的状态为僵死(Z),则这些进程就为僵尸线程。

2.资源回收

线程资源回收的方法有4种:(PS:由于前两种方法用的频率较少这里着重介绍第3,4种方法的用法)

2.1.使用pthread_join()函数

如果线程没有设置unjoinable属性,可以使用pthread_join()函数阻塞当前线程,直到指定的线程结束为止,然后释放该线程的资源,最后在退出主函数。

2.2.设置分离属性

如果线程在创建时设置了unjoinable属性,那么当线程退出时,系统会自动回收线程所占用的资源。可以通过pthread_attr_setdetachstate()函数来设置线程的分离属性。

2.3.在主程序中使用pthread_detach函数

在主程序中调用pthread_detach函数将线程设置为分离状态,一旦一个线程被分离,其资源将会被系统自动回收,不需要其他线程来调用pthread_join函数等待其结束。定义如下:

int pthread_detach(pthread_t thread);

其中thread代表线程的标识符.

2.3.1举例说明

#include <pthread.h>    
#include<string.h>   
#include<stdio.h>    
#include<unistd.h>   
#include<stdlib.h>   
#include<iostream> 
  
void *pth1(void* str){  // 定义一个线程函数pth1,它没有参数并且返回一个void指针。  
    std::cout<<"第一个线程"<<std::endl;  
}  
  
int main(void){    
    pthread_t thread1;  // 定义一个pthread_t类型的变量thread1,用于存储线程ID。  
    pthread_create(&thread1,NULL,pth1,NULL);  // 使用pthread_create函数创建新的线程。新线程开始执行pth1函数,并将thread1的地址作为返回值。  
    pthread_detach(thread1);  // 使用pthread_detach函数将thread1线程分离。这意味着当该线程结束时,其资源会自动被系统回收,不需要其他线程来调用pthread_join。  
    std::cout<<"第一个线程退出"<<std::endl;   
    std::cout<<"主函数退出"<<std::endl;   
} 

2.4.在线程程序中使用pthread_detach函数

 在线程中调用pthread_detach函数将线程设置为分离状态。与方法3类似,但是传参稍有变化.

2.4.1举例说明

#include <pthread.h>  
#include<string.h>  
#include<stdio.h>  
#include<unistd.h>  
#include<stdlib.h>  
#include<iostream>  
void *pth1(void* str){  // 定义一个线程函数pth1,它没有参数并且返回一个void指针。  
    // 使用pthread_detach函数将当前线程分离。这意味着当该线程结束时,其资源会自动被系统回收,不需要其他线程来调用pthread_join。  
    pthread_detach(pthread_self());  
    std::cout<<"第一个线程"<<std::endl;  
}  
int main(void){  
    // 定义一个pthread_t类型的变量thread1,用于存储线程ID。  
    pthread_t thread1;  
    // 使用pthread_create函数创建新的线程。新线程开始执行pth1函数,并将thread1的地址作为返回值。  
    pthread_create(&thread1,NULL,pth1,NULL);    
    std::cout<<"第一个线程退出"<<std::endl;  
    std::cout<<"主函数退出"<<std::endl;  
    return 0; 
}

在终端运行程序

g++ -o phread pthread.cpp -lpthread
./phread


可以看到,主程序已经运行完退出后,子线程才运行结束.这是由于我们没有使用pthread_join()函数,系统并不会因为等待子线程运行而发生阻塞.

现在看看是否存在僵尸线程,在终端使用ps -el:

可以发现,并没有僵尸线程!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1363156.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity中Shader的_Time精度问题

文章目录 前言一、U方向上优化二、V方向上优化在这里插入图片描述 三、最终代码1、效果2、Shader 前言 在Unity的Shader中&#xff0c;使用了_Time来达到UV的流动效果&#xff0c;普遍会出现一个问题。我们的UV值会随着时间一直增加&#xff08;uv值增加了&#xff0c;但是因为…

三大主要排序方法总结:快速排序,选择排序,冒泡排序

本文介绍&#xff1a;三大排序方法&#xff08;快速排序&#xff0c;选择排序&#xff0c;冒泡排序&#xff09;&#xff08;后续期间可能会发布一篇关于qsort函数的文章&#xff09; 自我介绍&#xff1a;一个脑子不好的大一学生&#xff0c;c语言接触还没到半年&#xff0c;…

【Pytorch】学习记录分享11——GAN对抗生成网络

PyTorch GAN对抗生成网络 0. 工程实现1. GAN对抗生成网络结构2. GAN 构造损失函数&#xff08;LOSS&#xff09;3. GAN对抗生成网络核心逻辑3.1 参数加载&#xff1a;3.2 生成器&#xff1a;3.3 判别器&#xff1a; 0. 工程实现 原理解析&#xff1a; 论文解析&#xff1a;GAN…

LLM Agent之RAG的反思:放弃了压缩还是智能么?

已经唠了三章的RAG&#xff0c;是时候回头反思一下&#xff0c;当前的RAG是解决幻觉的终点么&#xff1f;我给不出直接的答案&#xff0c;不过感觉当前把RAG当作传统搜索框架在大模型时代下的改良&#xff0c;这个思路的天花板高度有限~ 反思来源于对RAG下模型回答的直观感受&…

DrGraph原理示教 - OpenCV 4 功能 - 直方图

OpenCV直方图是一种可以对整幅图的灰度分布进行整体了解的图示。它是带有像素值&#xff08;从0到255&#xff0c;不总是&#xff09;的图在X轴上&#xff0c;在y轴上的图像对应的像素个数。通过观察图像的直方图&#xff0c;我们可以直观的了解图像的对比度、亮度、亮度分布等…

数据分析——快递电商

一、任务目标 1、任务 总体目的——对账 本项目解决同时使用多个快递发货&#xff0c;部分隔离区域出现不同程度涨价等情形下&#xff0c;如何快速准确核对账单的问题。 1、在订单表中新增一列【运费差异核对】来表示订单运费实际有多少差异&#xff0c;结果为数值。 2、将…

HarmonyOS 开发基础(六)Slider

HarmonyOS 开发基础&#xff08;六&#xff09;Slider Entry Component struct Index {build() {Row() {Column() {// Slider&#xff1a;ArkUI 的基础组件 滑动条组件// options 参数&#xff1a;Slider 基础设置Slider({// 最小值min: 20,// 最大值max: 200,// 当前值value: …

文心一言 VS 讯飞星火 VS chatgpt (173)-- 算法导论13.3 2题

二、用go语言&#xff0c;将关键字41、38、31、12、19、8连续地插入一棵初始为空的红黑树之后&#xff0c;试画出该结果树。 文心一言&#xff1a; 首先&#xff0c;我们需要了解红黑树的性质。红黑树是一种自平衡二叉查找树&#xff0c;其中每个节点要么是红色&#xff0c;要…

使用sentinel作为熔断器

什么是sentinel Sentinel&#xff0c;中文翻译为哨兵&#xff0c;是为微服务提供流量控制、熔断降级的功能&#xff0c;它和Hystrix提供的功能一样&#xff0c;可以有效的解决微服务调用产生的“雪崩”效应&#xff0c;为微服务系统提供了稳定性的解决方案。随着Hytrxi进入了维…

7+非肿瘤+WGCNA+机器学习+诊断模型,构思巧妙且操作简单

今天给同学们分享一篇生信文章“Platelets-related signature based diagnostic model in rheumatoid arthritis using WGCNA and machine learning”&#xff0c;这篇文章发表在Front Immunol期刊上&#xff0c;影响因子为7.3。 结果解读&#xff1a; DEGs和血小板相关基因的…

Flink自定义Source模拟数据流

maven依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.…

CSS3 边框border、outline、box-shadow

1 border 语法&#xff1a;border: width style color 2 outline 语法&#xff1a;outline: width style color 2.1 outline-offet MDN解释&#xff1a;用于设置outline与一个元素边缘或边框之间的间隙 即&#xff1a;设置outline相对border外边缘的偏移&#xff0c;可以为…

Python 全栈体系【四阶】(十一)

第四章 机器学习 机器学习&#xff1a; 传统的机器学习&#xff1a;以算法为核心深度学习&#xff1a;以数据和计算为核心 感知机 perceptron&#xff08;人工神经元&#xff09; 可以做简单的分类任务掀起了第一波 AI 浪潮 感知机不能解决线性不可分问题&#xff0c;浪潮…

RouterOS L2TP安装与配置

申明&#xff1a;本文仅针对国内L2TP/PPTP&#xff0c;适用于国内的游戏加速或学术研究&#xff0c;禁止一切利用该技术的翻墙行为。 1. L2TP介绍 L2TP&#xff08;Layer 2 Tunneling Protocol&#xff09;是一种在计算机网络中广泛使用的隧道协议&#xff0c;它被设计用于通过…

java火车查询管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web火车查询管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql…

2023年12月 C/C++(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 第1题:数的输入和输出 输入一个整数和双精度浮点数,先将浮点数保留2位小数输出,然后输出整数。 时间限制:1000 内存限制:65536 输入 一行两个数,分别为整数N(不超过整型范围),双精度浮点数F,以一个空格分开。 输出 一行两个数,分…

电子学会C/C++编程等级考试2023年12月(二级)真题解析

C/C++编程(1~8级)全部真题・点这里 第1题:统计指定范围里的数 给定一个数的序列S,以及一个区间[L, R], 求序列中介于该区间的数的个数,即序列中大于等于L且小于等于R的数的个数。 时间限制:1000 内存限制:65536 输入 第一行1个整数n,分别表示序列的长度。(0 < n ≤…

使用Enterprise Architect绘制架构图

如何使用Enterprise Architect绘制架构图 之前没有使用过Enterprise Architect软件绘制&#xff0c;目前由于工作需求&#xff0c;需要使用Enterprise Architect绘制一些架构图&#xff0c;现在只使用Enterprise Architect绘制过简单的Flow Chart&#xff0c;想请教一下大神们…

如何批量自定义视频画面尺寸

在视频制作和编辑过程中&#xff0c;对于视频画面尺寸的调整是一项常见的需求。有时候&#xff0c;为了适应不同的播放平台或满足特定的展示需求&#xff0c;我们需要对视频尺寸进行批量调整。那么&#xff0c;如何实现批量自定义视频画面尺寸呢&#xff1f;本文将为您揭示这一…

纳尼??Rabbitmq居然被一个逗号给坑了??

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 前言 这个问题发生在部署一套新的环境。搭建一个单节点的Rabbitmq&#xff0c;按照小伙伴写的部署文档搭建的。其中搭建步骤和我…