以下是您提供的文本内容的排版整理版本。我已根据内容主题将其分为几个主要部分(互斥锁、信号量、死锁、IPC进程间通信、管道操作),并使用清晰的结构组织信息:

  • 代码片段用代码块格式(指定语言为C)突出显示。
  • 函数定义和步骤使用有序列表整理。
  • 关键概念用加粗或小标题强调。
  • 整体结构基于逻辑顺序优化,确保易读性,但未修改原始内容含义。

互斥锁机制

互斥机制确保多线程中对临界资源的排他性访问(公共资源)。框架包括定义、初始化、加锁、解锁和销毁步骤。

  1. 定义互斥锁

    pthread_mutex_t mutex; // 互斥锁类型变量
    

  2. 初始化锁

    • 函数:int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);
      • 功能:初始化已定义的互斥锁。
      • 参数:
        • mutex:要初始化的互斥锁指针。
        • attr:初始化属性值,通常为NULL(表示默认锁)。
      • 返回值:成功返回0,失败返回非零值。
  3. 加锁

    • 函数:int pthread_mutex_lock(pthread_mutex_t *mutex);
      • 功能:对指定代码加锁,加锁后代码为原子操作(其他线程无法访问)。
      • 参数:mutex为互斥锁指针。
      • 返回值:成功返回0,失败返回非零值。
      • 注意:如果锁已被占用,则阻塞当前线程。
  4. 解锁

    • 函数:int pthread_mutex_unlock(pthread_mutex_t *mutex);
      • 功能:解锁指定互斥锁。
      • 参数:mutex为互斥锁指针。
      • 返回值:成功返回0,失败返回非零值。
      • 注意:加锁和解锁通常成对出现。
  5. 销毁锁

    • 函数:int pthread_mutex_destroy(pthread_mutex_t *mutex);
      • 功能:销毁互斥锁。
      • 参数:mutex为互斥锁指针。
      • 返回值:成功返回0,失败返回非零值。
  6. 非阻塞锁(trylock)

    • 函数:int pthread_mutex_trylock(pthread_mutex_t *mutex);
      • 功能:类似加锁,但不阻塞。
      • 参数:mutex为互斥锁指针。
      • 返回值:成功返回0,失败返回非零值(如EAGAIN)。
    • 注意:互斥锁控制排他访问,但不保证次序。

信号量机制(Linux线程同步)

信号量用于线程或进程间同步,分类为:

  • 无名信号量:线程间通信。
  • 有名信号量:进程间通信。

框架包括定义、初始化、PV操作和销毁。

  1. 定义信号量

    sem_t sem; // 信号量类型变量
    

  2. 初始化信号量

    • 函数:int sem_init(sem_t *sem, int pshared, unsigned int value);
      • 功能:初始化已定义的信号量。
      • 参数:
        • sem:信号量指针。
        • pshared0表示线程间使用,非0表示进程间使用。
        • value:初始值(例如,二值信号量中,0表示阻塞,1表示通过)。
      • 返回值:成功返回0,失败返回非零值。
  3. PV操作

    • P操作(申请资源):sem_wait(sem_t *sem);(功能:减少信号量值,如果值为0则阻塞)。
    • V操作(释放资源):sem_post(sem_t *sem);(功能:增加信号量值,唤醒等待线程)。
    • 注意:PV操作确保同步。
  4. 销毁信号量

    • 函数:int sem_destroy(sem_t *sem);
      • 功能:销毁信号量。
      • 参数:sem为信号量指针。
      • 返回值:成功返回0,失败返回非零值。

死锁原因与必要条件

死锁产生原因:

  1. 系统资源不足。
  2. 进程运行推进顺序不合适。
  3. 资源分配不当。

死锁必要条件:

  1. 互斥条件:一个资源每次只能被一个进程使用。
  2. 请求与保持条件:进程因请求资源阻塞时,对已获得资源保持不放。
  3. 不剥夺条件:进程已获得资源在未使用完前不能被强行剥夺。
  4. 循环等待条件:若干进程形成头尾相接的循环等待资源关系。

注意:如果资源充足,死锁可能性低;否则易因争夺资源发生。


IPC进程间通信分类

IPC(Inter-Process Communicate)分为三大类:

  1. 古老通信方式

    • 无名管道。
    • 有名管道。
    • 信号(唯一异步通信方式)。
  2. IPC对象通信(System V)

    • 消息队列(较少使用)。
    • 共享内存(最高效方式)。
    • 信号量集。
  3. Socket通信:用于网络通信。

特例:线程信号使用sem_init(POSIX标准)。


管道操作(有名管道)

管道操作框架:打开、读写、关闭、卸载。

  1. 打开有名管道

    • 函数:int open(const char *pathname, int flags);
      • 注意:
        • 管道为半双工模式,打开方式决定读写端。
        • 示例:
          int fd_read = open("./fifo", O_RDONLY); // 固定为读端
          int fd_write = open("./fifo", O_WRONLY); // 固定为写端
          

        • 禁止使用O_RDWR(读写模式)或O_CREAT(创建选项),管道创建需用mkfifo函数。
  2. 管道读写

    • 读操作:read(fd_read, buff, sizeof(buff));
    • 写操作:write(fd_write, buff, sizeof(buff));
  3. 关闭管道

    • 函数:close(fd);
  4. 卸载管道

    • 函数:int unlink(const char *pathname);
      • 功能:移除管道文件。

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

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

相关文章

COZE官方文档基础知识解读第六期 ——数据库和知识库

一,一键直连数据上传,存储,使用 火山方舟的数据库和知识库的核心,都是基于开源的数据库产品(mysql,向量数据库等),将数据库交互的逻辑封装在后端,与前端做耦合&#xff0…

生产环境使用云服务器(centOS)部署和使用MongoDB

部署MongoDB流程1. ​安装MongoDB​版本选择建议​CentOS 7​:推荐MongoDB 4.4.x(兼容性好)​CentOS 8/9​:建议最新稳定版(如6.0),需单独安装mongodb-database-tools安装步骤1.添加官方仓库# 添…

思博伦第二到三层测试仪(打流仪)TestCenter 2U硬件安装及机箱加电_双极未来

(1)安装板卡:上图中共 4 个红色线框,上边两个红色线条框住的是机箱的左右两侧导轨,下边两条红色 线条框住的是板卡拉手条(用于承载板卡PCB的金属板)左右两边的边沿。 安装时将拉手条两边的边沿与…

【华为】笔试真题训练_20250611

本篇博客旨在记录自已的笔试刷题的练习,里面注有详细的代码注释以及和个人的思路想法,希望可以给同道之人些许帮助。本人也是小白,水平有限,如果文章中有什么错误或遗漏之处,望各位可以在评论区指正出来,各…

新浪微博APP v14.5.0:连接世界的社交媒体平台

新浪微博APP 是一款广受欢迎的社交媒体应用程序,凭借其强大的功能和丰富的社交生态,成为用户获取信息、表达观点、互动交流的重要平台。最新版 v14.5.0 内置了微博助手 v2.3.0,进一步提升了用户体验和功能多样性。 软件功能 1. 发布微博 用…

静态枚举返回(简单实现字典功能)

枚举缓存策略的实现与应用 通过静态Map缓存枚举类的Class对象&#xff0c;避免每次请求时重复反射加载。核心实现是一个包含枚举类名与对应Class映射的Registry类&#xff1a; public class EnumRegistry {private static final Map<String, Class<?>> ENUM_MAP …

深分页性能问题分析与优化实践

在日常测试工作中&#xff0c;我们经常会遇到分页查询接口&#xff0c;例如&#xff1a; GET /product/search?keyword&pageNum1&pageSize10乍看之下&#xff0c;这样的分页接口似乎并无性能问题&#xff0c;响应时间也很快。但在一次性能压测中&#xff0c;我们复现了…

LeetCode——1957. 删除字符使字符串变好

通过万岁&#xff01;&#xff01;&#xff01; 题目&#xff1a;给你一个字符串&#xff0c;然后让你删除几个字符串&#xff0c;让他变成好串&#xff0c;好串的定义就是不要出现连续的3个一样的字符。思路&#xff1a;首先就是要遍历字符串。我们将要返回的字符串定义为ret&…

Aerospike与Redis深度对比:从架构到性能的全方位解析

在高性能键值存储领域&#xff0c;Aerospike与Redis是两款备受关注的产品。Redis以其极致的单机性能和丰富的数据结构成为主流选择&#xff0c;而Aerospike则凭借分布式原生设计和混合存储架构在大规模场景中崭露头角。本文将从架构设计、数据模型、性能表现、扩展性等核心维度…

Linux命令速查手册

一、命令格式与辅助工具类别符号/命令示例说明基本格式commandls -a /home命令 选项 参数管道符ls -lless重定向>df -h > disk_usage.txt覆盖写入文件>>echo "New" >> notes.txt追加写入文件2>ls non_exist 2> error.txt错误输出重定向快捷…

net-snmp添加自定义mib树

首先我们把前面mib2c生成的文件修改 下面重新做了个简单点的MIB树 -- -- -- MIB generated by MG-SOFT Visual MIB Builder Version 6.0 Build 88 -- Saturday, July 26, 2025 at 09:24:54 --ARHANGELSK-GLOBAL-REG DEFINITIONS :: BEGINIMPORTSenterprises, OBJECT-TYPE, M…

【动态规划-斐波那契数列模型】理解动态规划:斐波那契数列的递推模型

算法相关知识点可以通过点击以下链接进行学习一起加油&#xff01;动态规划是一种解决最优化问题的强大技术&#xff0c;通过将问题分解为子问题并逐步求解来实现高效计算。斐波那契数列是动态规划中经典的应用之一&#xff0c;其递推关系非常适合用动态规划进行优化。通过动态…

微信小程序 自定义带图片弹窗

1. 微信小程序 自定义带图片弹窗1.1. 实现思路使用官方组件实现图片模态弹窗。首先找到官方文档&#xff1a;​显示模态弹窗的API wx.showModal(OBJECT)wx.showModal参数介绍发现并没有设置图片的参数&#xff0c;但是这是一个API&#xff0c;但是组件呢&#xff1f;我并没有在…

私有化大模型架构解决方案构建指南

内容概要本指南旨在为企业提供私有化大模型架构解决方案的全面构建路径&#xff0c;帮助其在保障数据隐私的同时提升业务效率。我们将系统解析关键环节&#xff0c;包括安全部署策略设计、模型训练核心技术、持续优化机制构建以及知识管理实践路径。此外&#xff0c;指南还涵盖…

面试150 查找和最小的K对数字

思路1 超时法&#xff1a;通过两个循环记录三元组[num1,num2,num1num2]然后通过num1num2从小到大进行排序&#xff0c;然后返回前K个对数中的前两个数即可。 class Solution:def kSmallestPairs(self, nums1: List[int], nums2: List[int], k: int) -> List[List[int]]:if n…

vscode目录,右键菜单加入用VSCode打开文件和文件夹(快速解决)(含删除)(脚本)

1.创建文本文件 在桌面右键单击&#xff0c;选择“新建” > “文本文档”&#xff0c;将其命名为“vscode.txt”2.复制代码内容3.修改文件扩展名 右键单击“vscode.txt”文件&#xff0c;选择“重命名”&#xff0c;将文件扩展名从.txt改为.reg&#xff0c;使其成为“vscode…

Chart.js 柱形图详解

Chart.js 柱形图详解 引言 在数据可视化领域&#xff0c;柱形图是一种非常常见的图表类型&#xff0c;它能够直观地展示不同类别或组的数据之间的比较。Chart.js 是一个基于 HTML5 Canvas 的开源库&#xff0c;它提供了一系列的图表绘制功能&#xff0c;其中包括柱形图。本文将…

沉浸式文旅新玩法-基于4D GS技术的真人数字人赋能VR体验升级

线下沉浸式剧场与 LBE VR 相结合&#xff0c;会碰撞出什么样的火花&#xff1f;本次 PICO 视频、东方演艺集团与火山引擎一起&#xff0c;将沉浸式演出《只此周庄》的部分场景复刻到了 VR 世界&#xff0c;让用户在虚拟的古代周庄夜市里&#xff0c;体验了古老的故事以及精彩纷…

C程序内存布局详解

C程序内存布局详解 1. 内存布局概述 C程序在内存中分为以下几个主要区域&#xff08;从低地址到高地址&#xff09;&#xff1a; 代码段&#xff08;.text&#xff09;只读数据段&#xff08;.rodata&#xff09;初始化数据段&#xff08;.data&#xff09;未初始化数据段&…

新手向:Git下载全攻略

Git 的安装与重要性在现代软件开发中&#xff0c;版本控制是必不可少的工具&#xff0c;而 Git 是目前最流行的分布式版本控制系统。无论是个人开发者还是大型团队&#xff0c;Git 都能高效管理代码变更&#xff0c;确保项目历史清晰可追溯。安装 Git 是开发者入门的第一步&…