线程的退出、资源回收,互斥锁

news2024/9/21 10:47:02

创建多个线程,用循环的方式:

一、线程结束方式

1、pthread_exit(void *)

2、pthread_return

3、pthread_cancle:异常退出,无法获得退出状态,只能回收资源。

程序实例:

二、线程资源回收

1、pthread_join

2、pthread_detach

        线程分离状态:指定该状态,线程主动与主控线程断开关系。使用pthread_exit或者线程自动结束后,其退出状态不由其他线程获取,而直接自己自动释放。网络、多线程服务器常用。

        进程若有该机制,将不会产生僵尸进程。僵尸进程的产生主要由于进程死后,大部分资源被释放,一点残留资源仍存于系统中,导致内核认为该进程仍存在。

函数描述:实现线程分离
函数原型:int pthread_detach(pthread_t thread);
函数返回值:成功:0;失败:错误号
         如果已经对一个线程调用了pthread_detach就不能再调用pthread_join了。其终止状态一直保留到其它线程调用pthread_join获取它的状态为止。但是线程也可以被置为detach状态,这样的线程一旦终止就立刻回收它占用的所有资源,而不保留终止状态。不能对一个已经处于detach状态的线程调用pthread_join。

三、线程和进程

四、互斥锁

机制:锁是一种线程间 同步机制 

原因:线程间的资源竞争:
           共享资源:    临界资源
           临界区  :    访问共享资源(临界资源)那段代码 

用于确保在任意时刻只有一个线程能够访问共享资源,从而避免数据竞争和不确定性的结果。互斥锁提供了一种方式,使得一段关键代码(临界区)在同一时刻只能被一个线程执行。

 1.初始化互斥锁
        (1)静态方式

#include <pthread.h>

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

          (2)动态方式

pthread_mutex_t mutex;
pthread_mutex_init(&mutex, NULL);

         2.加锁
pthread_mutex_lock(&mutex); 

        如果互斥锁已被其他线程锁定,调用线程将被阻塞,直到互斥锁被解锁。 

        3.解锁
pthread_mutex_lock(&mutex); 

        解锁后,其他线程就可以获取该互斥锁。 

        4.销毁锁
pthread_mutex_destroy(&mutex); 

man pthread_mutex_init

五、死锁

1、死锁产生的4个必要条件
        (1)互斥:某种资源一次只允许一个进程访问,即该资源一旦分配给某个进程,其他进程就不能再访问,直到该进程访问结束;

         (2)占有且等待:一个进程本身占有资源,同时还有资源未得到满足,正在等待其他进程释放该资源。(上述例子讲的)

         (3)不可抢占:别人已经占有了某项资源,不能因为你要用这个资源就把他抢过来;

         (4)循环等待:存在一个进程链,使得每个进程都占有下一个进程所需要的至少一种资源

        发生死锁进程无法进行下去,他们所持有的资源也无法释放。这样会导致CPU的吞吐量下降。所以死锁情况是会浪费系统资源和影响计算机的使用性能的。

2、处理死锁

抢占资源: 从一个或者多个进程中抢占足够多数量的资源,分配给死锁进程,以解除死锁。

终止进程法(包括终止所有死锁进程和逐个终止进程): 终止系统中的一个或多个死锁进程,纸质打破循环环路,使系统从死锁状态中解脱出来。

进程回退法。

lock和trylock的区别

pthread_mutex_lock() 来获取锁,这种方式会使线程在无法立即获得锁时被阻塞,直到锁变为可用。这意味着每个线程在更新计数器时都需要等待,直到前一个线程释放锁。

pthread_mutex_trylock() 来尝试获取锁。如果锁当前被占用,pthread_mutex_trylock() 会立即返回一个非零值(表示获取锁失败),而不是阻塞线程。这意味着线程在无法获得锁时会选择继续循环尝试获取锁,而不是被阻塞。这种方式可能导致一些线程无法及时获取锁,从而降低了程序的效率,并且可能导致线程间的公平性问题。

time 命令 + 可执行程序:查看程序运行了多久时间。

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

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

相关文章

异构数据同步 datax (1)

阿里实现异构数据库之间的表数据集同步 Reader & Framework & Writer job 当然好用的框架&#xff0c;自然有很多优点 1&#xff09;可靠的数据质量监控 2) 丰富的数据转换功能 DataX作为一个服务于大数据的ETL工具&#xff0c;除了提供数据快照搬迁功能之外&#…

Gather在全球隐私保护领域的先锋地位

随着全球数字化进程的加速&#xff0c;隐私保护已成为各国政府、企业以及个人用户的共同关注点。近年来&#xff0c;频发的数据泄露事件和隐私侵害问题&#xff0c;让用户对安全通信和隐私保护的需求愈发强烈。据 IBM Security 统计&#xff0c;2024 年全球数据泄露的平均成本为…

C语言程序设计-[21] 字符串处理函数

C语言程序库中提供了一些专门处理字符串的函数: gets(字符数组); 输入一行字符序列到字符数组puts(字符串); 将字符串输出到终端strcat(字符数组1,字符串2); 字符串连接strcpy(字符数组1,字符串2); 复制字符串strcmp(字符串1, 字符串2); 两个字符串比较s…

【Kubernetes】k8s集群对外服务之Ingress

目录 一.Ingress 概述 1.什么是ingress 2.外部应用访问集群内部服务的方案 3.ingress 组成 4.ingress-Nginx 工作原理 二.部署 nginx-ingress-controller 方式一 方式二 三.总结 一.Ingress 概述 1.什么是ingress service的作用体现在两个方面&#xff0c;①对集群内…

AI初级教程-AI到底有什么样的具体价值

一、开头放重点 一个在国内好用且免费的AI工具&#xff0c;可以让自己的学习或者工作方面&#xff0c;事半功倍&#xff01; &#x1f525;世界主流大模型集聚地 免魔法 白玩GPT4 AI智能工作流 Codemoss_能用AI 传送门&#xff1a;https://www.nyai.chat/chat?inviteny…

第三方软件测试机构如何通过测试保障软件产品质量?

在当今数字化快速发展的时代&#xff0c;软件的质量直接影响至关重要的业务性能和用户体验。卓码软件测评作为一家专业的第三方软件测试机构&#xff0c;深知高质量软件对企业成功的重要性&#xff0c;那么是如何保障软件产品质量呢&#xff1f;主要有以下方式&#xff1a; 一…

具有重新参数化异构卷积的多分支辅助融合YOLO,用于精确的目标检测(MAF-YOLO)

中英文对照阅读https://yiyibooks.cn/arxiv/2407.04381v1/index.html 摘要 由于多尺度特征融合的有效性能&#xff0c;路径聚合 FPN (PAFPN) 被广泛应用于 YOLO 检测器中。 然而&#xff0c;它不能有效地、自适应地同时集成高层语义信息和低层空间信息。 我们在本文中提出了一…

Spring boot logback日志框架加载初始化源码

##LoggingApplicationListener监听 Overridepublic void onApplicationEvent(ApplicationEvent event) {if (event instanceof ApplicationStartingEvent) {onApplicationStartingEvent((ApplicationStartingEvent) event);}else if (event instanceof ApplicationEnvironment…

java中List列表转成子父集列表

一、前言 在Java中&#xff0c;如果你有一个表示父子关系的列表&#xff0c;并且想要把这个列表转成一个子父集list列表树目录&#xff0c;一般来说想要把list列表转成一个子父集列表&#xff0c;这个对象需要在属性中必须要有几个字段&#xff0c;id&#xff08;节点id&#x…

机械行业数字化生产供应链产品解决方案(十二)

我们为机械行业提供的数字化生产供应链解决方案通过集成物联网、人工智能和大数据技术&#xff0c;打造了一套智能化的生产和供应链管理系统&#xff0c;实现了从设计、生产到物流的全程数字化、智能化。该系统通过实时数据采集与分析&#xff0c;优化生产计划和资源配置&#…

mybatis批量修改问题

update 表名称 set version version 1, update_time NOW(), basket_price case when id1130254 then 0.00 end, basket_spec_name case when id1130254 then “名称1” when id1130255 then “名称” end where id IN ( 1130254 , 1130255); 为什么 id为 1130255 的 baske…

Halcon 算子汇总

gen_tuple_const(1000,1.5) 生成一个长度为1000&#xff0c;里面每一个数组元素都为1.5的数组 gen_tuple_const(100,chr(ord(a) 1)) 生成一个长度为100&#xff0c;里面每一个数组元素都为b的数组 ord函数是库函数&#xff0c;用于获取字符的ASCII值 chr(ord(a) 1) 结…

算法设计与分析(快速幂算法

目录 1. 题目&#xff1a;2. 代码&#xff1a;2.1边界条件处理2.2分治策略2.3合并结果2.4递归终止条件2.5效率分析 小结&#xff1a; 1. 题目&#xff1a; 2. 代码&#xff1a; #include<iostream> using namespace std;int pow(int x, int n){// 边界条件 if (x 0) re…

大数据技术——实战项目:广告数仓(第七部分)数仓工作流调度实操

目录 第12章 广告数仓全流程调度 12.2 新数据生成 12.2.1 广告监测日志 12.2.2 广告管理平台数据 12.3 工作流调度实操 12.3.1 DolphinScheduler集群模式 12.3.2 DolphinScheduler单机模式 第12章 广告数仓全流程调度 12.1 调度工具Dolphinscheduler DolphinScheduler…

鸿蒙HarmonyOS:应用程序开发与使用-延迟加载(lazy import)

随着应用程序功能的不断扩展&#xff0c;冷启动所需的时间显著增长&#xff0c;主要是由于在启动初期加载了大量模块&#xff0c;其中存在大量未被实际执行的冗余文件。这种情形不仅拖延了应用的初始化过程&#xff0c;还造成了资源的无效占用。亟需采取措施精简加载流程&#…

解决IDEA-HTTP状态500-内部服务器错误

目录 背景: 解决过程: MySQL的优点和缺点: 背景: 类型异常报告 消息无法打开Hibernate会话进行事务处理&#xff1b;嵌套异常是org.hibernate.exception.GenericJDBCException:无法连接 描述服务器遇到了意外情况&#xff0c;导致无法满足请求等等.... 在运行项目的时候&…

Linux中以单容器部署Nginx+ASP.NET Core

强烈推荐在生产环境中使用反向代理服务器转发请求到Kestrel Http服务器&#xff0c;本文将会实践将Nginx --->ASP.NET Core 部署架构容器化的过程。 Nginx->ASP.NET Coe部署架构容器化 在Docker中部署Nginx--->ASP.NETCore 有两种选择&#xff0c; 第一种是在单容器…

【Java】解析方法的调用关系

目录 一、方法的定义二、方法的声明格式三、方法的调用四、特殊方法&#xff1a;程序入口main方法五、方法的局部变量六、类的静态变量七、类的静态方法八、方法的传参九、方法的重载 一、方法的定义 方法就是 将功能重复的代码封装成一段独立的代码&#xff0c;通过调用方法的…

Element Plus的el-carousel走马灯平铺多张图片

效果 <template><div class"system-banner"><el-carousel height"320px" indicator-position"outside" :autoplay"false"><el-carousel-item v-for"(item, index) in govList" :key"index"…

「VLM」CLIP 文本与图像的桥梁

github&#xff1a;https://github.com/OpenAI/CLIP paper&#xff1a;Learning Transferable Visual Models From Natural Language Supervision CLIP全称&#xff1a;Contrastive Language-Imge Pre-training&#xff0c;即对比语言-图像预训练。 对比学习是一种更关注于学习…