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

news2024/9/22 5:24:49

一、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.互斥锁

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

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

定义互斥锁
pthread_mutex_t mutex;

定义了一个名为mutex的互斥锁。

初始化互斥锁
#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.coloradmin.cn/o/2051183.html

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

相关文章

函数递归,匿名、内置行数,模块和包,开发规范

一、递归与二分法 一&#xff09;递归 1、递归调用的定义 递归调用&#xff1a;在调用一个函数的过程中&#xff0c;直接或间接地调用了函数本身 2、递归分为两类&#xff1a;直接与间接 #直接 def func():print(from func)func()func() # 间接 def foo():print(from foo)bar…

mac安装ipd包【金铲铲为例】

mac安装ipd包 安装PlayCover 链接&#xff1a;https://github.com/PlayCover/PlayCover 1、点最新Releases 2、cmd ↓&#xff0c;拉到最下面下载dmg 3、安装 图标拖拽到Applications里 IPA下载 以金铲铲为例&#xff0c;良心砸壳包站点&#xff0c;有能力可以支持一下…

系列:水果甜度个人手持设备检测-行业法律法规

系列:水果甜度个人手持设备检测 --行业法律法规 背景 由于我们目标是制作针对水果的便携或手持式检测仪器&#xff0c;既然是民用产品&#xff0c;必然受一系列法律法规的约束&#xff0c;产品在上市之前将会受各种国家标准和地方标准的检验。本篇章中我们采用启发性搜索的方…

Python自动化:解锁高效工作与生产力的密钥

在当今快节奏的数字时代&#xff0c;自动化已成为提升工作效率、优化流程、减少人为错误的不可或缺的工具。Python&#xff0c;作为一种功能强大、易于学习且应用广泛的编程语言&#xff0c;在自动化领域扮演着举足轻重的角色。无论是数据处理、Web自动化、软件测试&#xff0c…

ETL数据集成丨将SQL Server数据同步至Oracle的具体实现

一、背景 在构建企业级数据架构时&#xff0c;将SQL Server数据库的数据同步至数仓数据库&#xff08;如Oracle&#xff09;是一项至关重要的任务。这一过程不仅促进了跨系统数据的一致性与可用性&#xff0c;还为数据分析、商业智能以及决策支持系统提供了坚实的数据基础。 …

黑神话悟空什么配置可以玩?什么样的游戏本配置可以畅玩《黑神话:悟空》?黑神话悟空电脑配置推荐

相信不少游戏爱好者&#xff0c;近期被《黑神话&#xff1a;悟空》这款游戏刷屏了&#xff0c;预售开启不到5分钟&#xff0c;所有的产品即宣告售罄&#xff0c;预购3天销售额就破亿&#xff0c;并迅速登顶Steam全球榜。作为一款备受期待的国产3A游戏&#xff0c;以其精美的画面…

IOS 10 统一颜色管理和适配深色模式

实现分析 像系统那样&#xff0c;给项目中常用的颜色取名字&#xff0c;这里使用扩展语法实现&#xff0c;好处是可以像访问系统颜色那样访问自定义的颜色。 添加依赖 为了能使用16进制的颜色值&#xff0c;这里通过依赖DynamicColor框架来实现 #颜色工具类 #https://githu…

美国洛杉矶大带宽服务器安全与权限

美国洛杉矶的大带宽服务器因其优越的地理位置、高速稳定的网络连接、丰富的资源以及强大的计算能力而受到众多企业和个人用户的青睐。尤其是在网络安全和权限管理方面&#xff0c;洛杉矶的大带宽服务器更是表现突出。下面我们就来详细了解一下这些服务器在安全与权限方面的特点…

Linux配置Maven环境

目录 一、Linux配置Maven环境1.1 挑选Maven版本1.2 下载到linux服务器1.3 解压1.4 配置环境变量1.5 测试 一、Linux配置Maven环境 1.1 挑选Maven版本 官网地址&#xff1a;https://maven.apache.org/download.cgi 这里以当前最新版本3.9.8为例 获取其对应的下载链接&#xf…

人工智能的新兴能力:我们是在追逐神话吗

图片由作者使用 DALL-E 拍摄 模型的涌现属性 突现属性不仅是人工智能的一个概念&#xff0c;也是所有学科&#xff08;从物理学到生物学&#xff09;的一个概念。这一概念一直让科学家着迷&#xff0c;他们既在描述这一概念&#xff0c;也在试图理解其起源。诺贝尔物理学奖得…

bootchart抓Android系统启动各阶段性能数据

最近在做Android系统启动优化&#xff0c;首要任务是找到启动过程中各阶段耗时点&#xff0c;进而有针对性地进行优化。主要用bootchart抓开机数据&#xff0c;本文主要记录下工具的使用方法。 1.抓开机数据 adb root adb shell ‘touch /data/bootchart/enabled’ adb rebo…

HDFS的透明加密

一、HDFS透明加密原理 Hadoop的透明加密(HDFS Transparent Data Encryption) - TDE 1.HDFS中的数据明文存储 HDFS中的数据会以block的形式保存在各台数据节点的本地磁盘中,但这些block都是明文的。 通过Web UI页面找到Block的ID和副本位于的机器信息 如果在操作系统中直接访…

2024年运营技术与网络安全态势研究报告:遭遇多次网络威胁的比例暴增

随着 OT 组织不断在其业务环境中集成各种数字工具和技术&#xff0c;它们面临的安全挑战也日益变得愈加复杂和多样化。正如 NIST 指出&#xff0c; “虽然安全解决方案旨在解决典型 IT系统中的一些问题&#xff0c;但将这些相同的解决方案引入不同的 OT 环境时&#xff0c;必须…

excel实现图片转文字功能/excel 实现导出图片功能/excel导出图片不失真(解决excel导出图片模糊的问题)

excel实现图片转文字功能 excel实现图片转文字功能&#xff1a;方法1&#xff1a;使用QQ的在线文档进行图片转文字方法2&#xff1a;使用WPS的excel文档进行图片转文字pdf图片转表格 使用excel 导出图片的方法&#xff08;使用Excel内置的“复制为图片”功能&#xff09;1. 复制…

Java序列化流和反序列化流

序列化流&#xff1a; 序列化&#xff1a;将一个对象转换成网络中传输的流 对象输出流&#xff1a;ObjectOutputStream 反序列化&#xff1a;将网络中传输的流还原成一个对象 对象输入流&#xff1a;ObjectInputStream 一个类对象将来…

轻松上手MYSQL:MYSQL权限配置全攻略,打造安全的数据库环境

​ &#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》《MYSQL》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 ✨欢迎加入探索MYSQL权限配置之旅✨ &#x1f44b; 大家好&#xff01;文本学习和…

【秋招笔试】8.14联想(算法岗)-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收…

Cortex-A7的GIC(全局中断控制器)使用方法(6):基于stm32MP135的IRQ初始化及处理流程分析

0 参考资料 STM32MP13xx参考手册.pdf&#xff08;RM0475&#xff09; ARM Generic Interrupt Controller Architecture version 2.0 - Architecture Specification.pdf 1 基于Cortex-A7的STM32MP135的IRQ初始化及处理流程分析 熟悉基于Cortex-M内核的stm32系列MCU的一定对中断…

RabbitMQ练习(Hello World)

1、RabbitMQ教程 《RabbitMQ Tutorials》https://www.rabbitmq.com/tutorials RabbitMQ是一个消息代理&#xff0c;它接受并转发消息。你可以将其想象成一个邮局&#xff1a;当你将需要邮寄的信件放入邮筒时&#xff0c;你可以确信邮递员最终会将邮件投递给你的收件人。在这个…

LDR6500-type-c 接口小封装PD取电协议芯片

LDR6500 Type-C PD取电芯片是一种基于Type-C接口的电源传输的协议芯片&#xff0c;它通过Type-C接口中的CC&#xff08;Configuration Channel&#xff09;线进行通信&#xff0c;协商电压、电流及供电方向。当设备连接时&#xff0c;双方会进行握手通信&#xff0c;以确定彼此…