Linux系统编程(10)线程资源回收和互斥锁

一、pthread_cancel函数

pthread_cancel 函数用于请求取消一个线程。当调用 pthread_cancel 时,它会向指定的线程发送一个取消请求。

#include <pthread.h>int pthread_cancel(pthread_t thread);

thread:要发送取消请求的线程标识符。

  • 成功时,返回 0
  • 失败时,返回一个错误号

二、pthread_detach函数

pthread_detach 用于将线程标记为“分离”状态。分离线程(detached thread)在完成执行后会自动释放其资源,主线程不需要调用 pthread_join 来回收这些资源。

#include <pthread.h>int pthread_detach(pthread_t thread);

thread: 需要被分离的线程标识符。

  • 成功时,pthread_detach 返回 0
  • 失败时,返回一个错误号

分离线程会在执行结束后自动释放资源,无需其他线程调用

三、进程和线程的优缺点

进程

优点

  1. 隔离性强

    • 每个进程有独立的地址空间,进程间的内存是完全隔离的,这减少了一个进程崩溃或异常对其他进程的影响。
  2. 安全性高

    • 由于进程间内存隔离,一个进程无法直接访问或修改另一个进程的内存,提高了系统的安全性。
  3. 稳定性

    • 进程的独立性使得系统在处理错误或异常时更稳定,崩溃的进程不会直接影响其他进程。
  4. 适合复杂任务

    • 进程适用于需要完全独立执行的复杂任务,如不同的应用程序或服务。

缺点

  1. 创建和销毁开销大

    • 创建和销毁进程的开销较大,因为需要分配和管理独立的地址空间。
  2. 通信复杂

    • 进程间通信(IPC)较为复杂且性能开销较大。需要通过文件、管道、消息队列等方式来实现。

线程

优点

  1. 创建和销毁开销小

    • 线程创建和销毁的开销较小,因为线程共享同一进程的地址空间。
  2. 通信效率高

    • 线程之间的通信较为简单和高效,因为它们共享同一进程的地址空间,可以直接访问共享数据。
  3. 适合轻量级任务

    • 线程适用于需要并发执行的轻量级任务,如多线程的计算任务或I/O操作。

缺点

  1. 安全性较低

    • 由于线程共享进程的地址空间,一个线程的错误可能会影响到其他线程,增加了数据竞争和同步问题的风险。
  2. 同步复杂

    • 多线程程序需要处理线程间的同步和互斥,以避免竞争条件和数据不一致的问题,这增加了编程复杂性。
  3. 稳定性问题

    • 一个线程的崩溃或未处理的异常可能导致整个进程的崩溃,因为所有线程共享同一进程的资源和状态。

四、线程同步

        线程中共享的资源称为临界资源,使用临界资源的部分代码称为临界区

        1.互斥锁

        用于保护共享资源,确保在同一时刻只有一个线程能够访问这些资源(排他性),它是一种软件层面上 的锁。

        确保同一时间只有一个线程能够进入临界区(即访问共享资源的区域)。其他线程在进入临界区前必须等待直到互斥锁被释放。保证每个线程访问时的原子性操作。

初始化互斥锁
#include <pthread.h>int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);
  • mutex: 指向互斥锁的指针。
  • attr: 互斥锁的属性,通常为 NULL 以使用默认属性
加锁

阻塞形式加锁

int pthread_mutex_lock(pthread_mutex_t *mutex);

阻塞调用线程直到成功获取锁。锁定后,其他线程尝试获取该锁将被阻塞。

尝试锁定互斥锁
int pthread_mutex_trylock(pthread_mutex_t *mutex);

尝试获取锁,如果锁已被其他线程持有,则函数立即返回,而不是阻塞调用线程。

解锁
int pthread_mutex_unlock(pthread_mutex_t *mutex);

解锁互斥锁,使其他等待的线程能够获取锁。

销毁锁
int pthread_mutex_destroy(pthread_mutex_t *mutex);

销毁互斥锁,释放其占用的资源。需要确保没有线程在使用该互斥锁时调用。

  • 互斥锁引入了额外的性能开销过度使用互斥锁可能导致性能下降。
  • 如果不正确地使用互斥锁(如多次锁定或解锁),可能会导致死锁,程序将无法继续执行。

五、死锁

        死锁(Deadlock)是多线程或多进程编程中常见的一个问题,它指的是一组进程或线程在互相等待资源的过程中形成了一个循环依赖,导致它们都无法继续执行。简单来说,死锁是一种系统状态,在这种状态下,所有的进程或线程都在等待其他进程或线程释放资源,但由于互相等待,系统中的所有进程或线程都处于阻塞状态,无法继续执行。

死锁的形成有以下几个必要条件,只要其中任一条件不成立,死锁就不会发生:


1.互斥条件:只有对必须互斥使用的资源的争抢才会导致死锁(如哲学家的筷子、打印机设备)。
像内存、扬声器这样可以同时让多个进程使用的资源是不会导致死锁的(因为进程不用阻塞等待
这种资源)。

2.不剥夺条件:进程所获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放。
3.请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又被其他进程占有,此时请求进程被阻塞,但又对自己已有的资源保持不放。
4.循环等待条件:存在一种进程资源的循环等待链,链中的每一个进程已获得的资源同时被下一个进程所请求。

注意!发生死锁时一定有循环等待,但是发生循环等待时未必死锁(循环等待是死锁的必要不充分件)

如果同类资源数大于1,则即使有循环等待,也未必发生死锁。但如果系统中每类资源都只有一个,那循环等待就是死锁的充分必要条件了。

死锁的避免:只要使其中一个条件不满足就无法形成死锁。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Dify 开源大语言模型(LLM) 应用开发平台如何使用Docker部署与远程访问

目录 ⛳️推荐 前言 1. Docker部署Dify 2. 本地访问Dify 3. Ubuntu安装Cpolar 4. 配置公网地址 5. 远程访问 6. 固定Cpolar公网地址 7. 固定地址访问 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享…

Javascript反调试实现判断用户是否打开了浏览器控制台

前言 晓杰最近在研究如何防止用户恶意调试前端网页代码&#xff0c;防止打开控制台进行调试&#xff0c;首先禁用了浏览器页面右键事件和F12等快捷键&#xff01;然后利用了创建元素是否成功方式进行校验,具体实现代码如下。 代码 document.addEventListener(keydown, functi…

(贪心) LeetCode 376. 摆动序列

原题链接 一. 题目描述 如果连续数字之间的差严格地在正数和负数之间交替&#xff0c;则数字序列称为 摆动序列 。第一个差&#xff08;如果存在的话&#xff09;可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。 例如&#xff0c; [1, 7, 4, 9, 2,…

【LeetCode每日一题】——623.在二叉树中增加一行

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 广度优先遍历 二【题目难度】 中等 三【题目编号】 623.在二叉树中增加一行 四【题目描述】…

【每日刷题】Day100

【每日刷题】Day100 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 【模板】堆_牛客题霸_牛客网 (nowcoder.com) 2. 【模板】链表_牛客题霸_牛客网 (nowcoder.com) 3…

红酒与旅游攻略:旅行途中的风味之选

在旅行的道路上&#xff0c;我们总是渴望寻找那些能够触动心灵、留下深刻记忆的不同体验。而红酒&#xff0c;作为一种充满韵味和故事的饮品&#xff0c;无疑是旅行途中的风味之选。洒派红酒&#xff08;Bold & Generous&#xff09;&#xff0c;这款定制红酒&#xff0c;以…

【公式推导】Elucidating the Design Space of Diffusion-Based Generative Models 【论文精读】

Elucidating the Design Space of Diffusion-Based Generative Models 论文精读 关注B站可以观看更多实战教学视频&#xff1a;hallo128的个人空间 【更新中】EDM论文精读 论文链接 &#xff08;1&#xff09;论文&#xff1a;Elucidating the Design Space of Diffusion-Base…

连接投影仪/显示器只能扩展不能复制的解决方案

原文章&#xff1a;https://iknow.lenovo.com.cn/detail/121481 故障现象&#xff1a; 笔记本外接投影仪/显示器后&#xff0c;笔记本屏幕有显示&#xff0c;但投影仪却只有背景或没有显示&#xff1b; 原因分析&#xff1a; 此现象多发生在双显卡机型上&#xff0c;笔记本屏…

旺店通·企业奇门对接打通旺店通·企业奇门库存查询接口与创建盘点单接口

旺店通企业奇门对接打通旺店通企业奇门库存查询接口与创建盘点单接口 接入系统&#xff1a;旺店通企业奇门 慧策&#xff08;原旺店通&#xff09;是一家技术驱动型智能零售服务商&#xff0c;基于云计算PaaS、SaaS模式&#xff0c;以一体化智能零售解决方案&#xff0c;帮助零…

Python爬虫与数据分析:中国大学排名的深度挖掘

前言 &#x1f449; 小编已经为大家准备好了完整的代码和完整的Python学习资料&#xff0c;朋友们如果需要可以扫描下方CSDN官方认证二维码或者点击链接免费领取【保证100%免费】 一、选题背景 高考作为中国学生生涯中最为重要的事&#xff0c;在高考之后&#xff0c;选择一所…

Vision Transformer学习笔记

论文链接&#xff1a;https://arxiv.org/abs/2010.11929 项目链接&#xff1a;https://github.com/google-research/vision_transformer 本文代码链接&#xff1a;https://gitcode.com/gh_mirrors/de/deep-learning-for-image-processing/tree/master/pytorch_classification/v…

大模型面试系列-大模型算法工程师的面试题目与解答技巧详细说明

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下大模型面试系列-大模型算法工程师的面试题目与解答技巧详细说明。 文章目录 大模型算法工程师面试题1. Llama 2 中使用的注意力机制是什么&#xff1f;描述一下查询分组注意力。2. LangChain 的结构详细描述一下。…

【go语言】go-webview2用法(持续更新)

文章目录 背景核心接口和方法扩展接口遗憾的是 背景 目前为止&#xff0c;已经有很多优秀的electron应用。但其特点也很明显&#xff1a;使用htmlcssjs构建的布局很精致&#xff0c;但是体积不容小觑&#xff08;最新版electron-egg打包出来的程序已经300MB&#xff09;。 vs…

014集——浮点数值类型——C#学习笔记

浮点类型的特征 C# 支持以下预定义浮点类型&#xff1a; double a 12.3; System.Double b 12.3; 每个浮点类型的默认值都为零&#xff0c;0。 每个浮点类型都有 MinValue 和 MaxValue 常量&#xff0c;提供该类型的最小值和最大有限值。 float and double 类型还提供可表示非…

开放大世界的 GpuTerrain + RVT

Unity 原生有一个 Tarrain&#xff08;地形&#xff09;系统&#xff0c;但可惜并不能直接用于开放世界&#xff0c;当然是因为其效率问题。现在开放世界主流是使用 GpuTerrain RVT &#xff0c;也是一个成熟技术了。在项目中实现这个技术的是公司的 TA&#xff08;我只做了接…

学习计算机网络(三)——IP地址

一、IP协议&#xff08;IPV4、IPV6&#xff09; 表示形式&#xff08;两种&#xff09;&#xff1a; 点分十进制、二进制 地址被点分为4个部分&#xff0c;每个部分8位&#xff0c;总共32位。 A、B、C类地址都是单播地址&#xff08;一对一通信&#xff09;&#xff0c;D类…

kubernetes k8s Daemonset 控制器 原理 讲解 配置

目录 1 DaemonSet控制器&#xff1a;概念、原理解读 1.1 DaemonSet概述 1.2 DaemonSet工作原理&#xff1a;如何管理Pod&#xff1f; 1.3 Daemonset典型的应用场景 1.4 DaemonSet 与 Deployment 的区别Deployment 部署的副本 Pod 会分布在各个 Node 上&#xff0c;每个…

Python轻量级 NoSQL 数据库之tinydb使用详解

概要 在现代应用开发中,使用数据库来存储和管理数据是非常常见的需求。对于简单的数据存储需求,关系型数据库可能显得过于复杂。TinyDB 是一个纯 Python 实现的轻量级 NoSQL 数据库,专为嵌入式场景设计,适用于小型项目、原型开发和教学等场景。本文将详细介绍 TinyDB 库,…

宠物行为:健康信号的早期预警

宠物&#xff0c;作为我们家庭中不可或缺的一部分&#xff0c;它们的健康同样需要我们细心呵护。宠物的行为变化&#xff0c;往往预示着健康问题的出现。而智能科技的融入&#xff0c;让这一过程变得更加科学和精准。 智能听诊器&#xff1a;宠物健康的守护者 智能听诊器&…

ISO 13485认证:医疗器械行业的质量护航者

在医疗器械行业&#xff0c;产品质量关乎生命。为确保每一件医疗器械的安全与可靠&#xff0c;ISO 13485认证作为全球公认的质量管理体系标准&#xff0c;正为无数企业提供强大的质量保障。对于企业来说&#xff0c;获得这一认证不仅是质量管理的提升&#xff0c;更是开拓全球市…