操作系统(6) (Named /Unnamed Semaphore信号量详解)

目录

1: 信号量的基本概念

2: 命名信号量的示例代码

3. 无名信号量(Unnamed Semaphore)

背景(Background)

示例代码讲解

初始化无名信号量

线程函数

创建线程并等待完成

销毁信号量

总结

4. 对比


1: 信号量的基本概念

  1. 背景介绍

    • 信号量是一种并发编程中的同步原语,它用于协调多个进程对共享资源的访问。
    • 信号量可以控制资源的访问,例如,在多个进程尝试写入同一文件时,使用信号量可以确保只有一个进程能够在某一时刻执行写操作。
  2. 命名信号量(Named Semaphore)的工作方式

    • 命名信号量是共享在多个进程之间的信号量,可以通过名称来访问。
    • 要使用信号量,首先需要包含 <semaphore.h> 头文件。
  3. 创建命名信号量

    • 使用 sem_open 函数创建或打开信号量。例如,sem_open("/semaphore_name", O_CREAT, 0666, initial_value)
    • 参数解释:
      • "/semaphore_name":信号量的名称,需要唯一。
      • O_CREAT:表示如果信号量不存在则创建它。
      • 0666:权限标识(可读写)。
      • initial_value:信号量的初始值,表示可用的资源数。
  4. 获取和释放信号量

    • sem_wait:获取信号量。如果信号量值为0,则进程会阻塞,直到其他进程释放信号量。
    • sem_post:释放信号量,使信号量值加1,允许其他阻塞的进程继续执行。
  5. 关闭和删除信号量

    • sem_close:关闭信号量,表示不再需要使用它。
    • sem_unlink:删除信号量,使其不再在系统中存在。

2: 命名信号量的示例代码

sem_t *sema;
sema = sem_open(name, O_CREAT, 0666, VALUE);
sem_wait(sema);  // 获取信号量
printf("减少信号量\n");
sem_post(sema);  // 释放信号量
printf("增加信号量\n");
sem_close(sema); // 关闭信号量
sem_unlink(name); // 删除信号量
    •    代码解释:
      • sem_open:创建一个新的命名信号量。
      • sem_wait:等待并获取信号量(进入临界区)。
      • sem_post:释放信号量(离开临界区)。
      • sem_closesem_unlink:分别用于关闭和删除信号量。
    • 编译:
      • gcc semaphore_example.c -pthread -o semaphore_example
        

                                


3. 无名信号量(Unnamed Semaphore)

使用方法,重点是如何在线程中使用无名信号量来控制对共享资源的访问。

背景(Background)

无名信号量与具名信号量的区别在于,具名信号量通过sem_open创建,有一个名字可以在不同的进程间共享。无名信号量则存在于内存中,仅在同一进程内的多个线程或已映射相同共享内存的进程之间共享。

  • 无名信号量的创建:我们需要通过sem_init()函数来初始化无名信号量,而不是使用sem_open

  • sem_init() 函数定义如下:

int sem_init(sem_t *sem, int pshared, unsigned int value);
    • sem:指向信号量的指针
    • pshared:如果为0,信号量只在线程间共享;如果为非零,信号量可以在进程间共享。
    • value:信号量的初始值。
  • 使用信号量:使用sem_wait()来等待信号量,sem_post()来释放信号量。

  • 销毁信号量:通过sem_destroy()函数销毁无名信号量。销毁后,不能再使用此信号量,除非重新初始化。

示例代码讲解

初始化无名信号量
sem_init(&unnamed_sema, 0, VALUE);

这里初始化了一个信号量unnamed_sema,初始值为VALUEpshared值为0,表示此信号量仅在线程之间共享。

线程函数
void* thread_function(void *arg) {sem_wait(&unnamed_sema); // 等待信号量printf("Decrease semaphore by 1\n");counter += 1; // 修改共享变量printf("Job %d started\n", counter);sleep(2); // 模拟任务执行printf("Job %d finished\n", counter);sem_post(&unnamed_sema); // 增加信号量return NULL;
}
  1. sem_wait:等待并减小信号量值。线程进入临界区之前,信号量的值会减1,如果信号量值为0,线程会阻塞,直到其他线程释放信号量。
  2. 临界区操作counter是共享资源,多个线程要互斥地访问它。这里通过信号量确保只有一个线程可以进入临界区。
  3. sem_post:离开临界区后,释放信号量,将信号量的值加1,允许其他线程进入临界区。
创建线程并等待完成
pthread_create(&tid[0], NULL, &thread_function, NULL);
pthread_create(&tid[1], NULL, &thread_function, NULL);
pthread_join(tid[0], NULL);
pthread_join(tid[1], NULL);

创建两个线程并执行thread_function函数。pthread_join用于等待线程完成。

销毁信号量
sem_destroy(&unnamed_sema);

总结

  1. sem_init:创建和初始化无名信号量。
  2. sem_wait:等待并占用信号量,进入临界区。
  3. sem_post:释放信号量,离开临界区。
  4. sem_destroy:销毁信号量,释放资源。

4. 对比

标识方式通过名字(字符串)通过指针
创建方式sem_open()sem_init()
共享范围跨进程线程之间或共享内存进程间
销毁方式sem_close() + sem_unlink()sem_destroy()
使用场景进程间同步线程间同步,或同内存进程间同步
性能开销稍大,适用于跨进程高效,适用于线程同步

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

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

相关文章

VScode中CMake无高亮(就是没有补全的提示)

在我学的过程中我发现我的CMake是这样的&#xff0c;如下图 但在教学视频里是这样的&#xff08;如下图&#xff09; 这非常的难受&#xff0c;所以疯狂的找&#xff0c;最后是CMake报错有 原因就是&#xff1a;本地没有配置环境变量&#xff0c;解决方法是下一个cmake然后直接…

STM32-CubeIDE用串口通讯

USART串口通讯 一、轮询模式 1.设置所接引脚为UART异步模式 选择完成CTRLS保存。 2.编写测试代码&#xff08;自动发送hello world&#xff09; 在mian函数里面编写代码 原函数 调用函数&#xff0c;需要数据类型一致&#xff0c;使用函数通过串口发送数组里面的数据 打开串…

延迟队列实现及其原理详解

1.绪论 本文主要讲解常见的几种延迟队列的实现方式&#xff0c;以及其原理。 2.延迟队列的使用场景 延迟队列主要用于解决每个被调度的任务开始执行的时间不一致的场景&#xff0c;主要包含如下场景: 1.比如订单超过15分钟后&#xff0c;关闭未关闭的订单。 2.比如用户可以…

基于springboot+微信小程序校园自助打印管理系统(打印1)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于springboot微信小程序校园自助打印管理系统实现了管理员、店长和用户。管理员实现了用户管理、店长管理、打印店管理、打印服务管理、服务类型管理、预约打印管理和系统管理。店长实现…

vue3中报has no default export错误

原因 在同时使用Vetur和Volar插件的Vue2与Vue3项目中&#xff0c;遇到Module has no default export错误。通过在VSCode设置中将vetur.validation.script设为false&#xff0c;可以消除该报错&#xff0c;不影响实际运行。 解决办法 "vetur.validation.script": fa…

【Linux线程】Linux线程编程基础:概念、创建与管理

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;Linux “ 登神长阶 ” &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀Linux多线程 &#x1f4d2;1. 线程概念&#x1f4dc;2. 进程VS线程&#x1f4da;3. 线程控制…

算法魅力-双指针的实战

目录 1.双指针的介绍 1. 左右指针&#xff08;对撞指针&#xff09; 2. 快慢指针 2.题目练习讲解 2.1 移动零 算法思路 代码展示 画图效果效果 2.2 复写零 算法思路 代码展示 2.3 快乐数 算法思路 代码展示 2.4 盛最多水的容器 算法思路 代码展示 结束语 1.双指针的…

大模型带来新安全机遇

当前网络空间安全面临攻击隐蔽难发现、数据泄露风险高和违法信息审核难等挑战。大模型展现出强大的信息理解、知识抽取、意图和任务编排等能力&#xff0c;为网络空间安全瓶颈问题提供了新的解决思路和方法。与此同时&#xff0c;大模型发展也催生了恶意软件自动生成、深度伪造…

架构师之路-学渣到学霸历程-22

NFS文件共享服务器 今天开始了云计算-SRE架构师的第二个阶段&#xff0c; 第二阶段就是服务阶段了&#xff1b;第一个分享的就是NFS服务&#xff1b; 文件共享服务&#xff1b; 早上就了解一下NFS原理&#xff1b; 1、NFS文件共享服务器 NFS&#xff1a;就是network file sy…

【YOLO学习】YOLOv5详解

文章目录 1. 网络结构2. 结构整体描述2.1 输入端2.2 Backbone2.3 Neck2.4 Head 3. 模块细节3.1 Focus模块3.2 SPPF3.3 Bounding Box损失函数 4. 训练策略 1. 网络结构 1. 目标检测的模型框架大体都是以下图示这样的结构&#xff1a; 2. 关于 YOLOv5 的网络结构其实网上相关的讲…

数据结构 - 队列

队列也是一种操作受限的线性数据结构&#xff0c;与栈很相似。 01定义 栈的操作受限表现为只允许在队列的一端进行元素插入操作&#xff0c;在队列的另一端只允许删除操作。这一特性可以总结为先进先出&#xff08;First In First Out&#xff0c;简称FIFO&#xff09;。这意味…

R语言机器学习算法实战系列(八)逻辑回归算法 (logistic regression)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍教程下载数据加载R包导入数据数据预处理数据描述数据切割构建模型预测测试数据评估模型模型准确性混淆矩阵模型评估指标ROC CurvePRC Curve特征的重要性保存模型总结系统信息介绍 …

MySQL数据库和表的基本操作

文章目录 一、数据库的基础知识 背景知识数据库的基本操作二、数据类型 字符串类型数值类型日期类型三、表的基本操作 创建表查看表结构查看所有表删除表 一、数据库的基础知识 背景知识 MySQL是一个客户端服务器结构的程序 主动发送数据的这一方&#xff0c;客户端(client…

“智改数转”转了什么?

万界星空科技专门针对数字化改造申报的MES系统具有显著的技术优势和实施效果&#xff0c;能够为制造型企业提供全方位、高效、可靠的数字化转型支持。项目合作可以私信或者百度上海万界星空科技官网。 “智改数转”是一个综合性的过程&#xff0c;涉及企业多个方面的转型和升…

【python实战】利用代理ip爬取Alibaba海外版数据

引言 在跨境电商的业务场景中&#xff0c;数据采集是分析市场、了解竞争对手以及优化经营策略的重要环节。然而&#xff0c;随着越来越多企业依赖数据驱动决策&#xff0c;许多跨境电商平台为了保护自身数据&#xff0c;采取了更严格的防护措施。这些平台通过屏蔽大陆IP地址或部…

【Spring声明式事务失效的12种场景测试】

文章目录 一.Spring声明式事务是什么&#xff1f;二.Spring事务失效的12种场景1.访问权限问题 小结 一.Spring声明式事务是什么&#xff1f; Spring声明式事务是一种通过配置的方式管理事务的方法&#xff0c;它通过注解或XML配置来声明哪些方法需要事务管理&#xff0c;从而将…

JRT怎么从IRIS切换到PostGreSql库

1.执行M导出得到建库脚本文件 2.下载生成的脚本到本地D盘 3.修改驱动为PostGreSql 4.修改连接串 5.到PostGreSql里面创建一个jrtlis的数据库&#xff0c;模式为jrt 6.启动网站点击导入脚本按钮 导入完成了就可以正常使用PostGreSql库了

OpenCV高级图形用户界面(14)交互式地选择一个或多个感兴趣区域函数selectROIs()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 允许用户在给定的图像上选择多个 ROI。 该函数创建一个窗口&#xff0c;并允许用户使用鼠标来选择多个 ROI。控制方式&#xff1a;使用空格键或…

Google FabricDiffusion:开启3D虚拟试穿新篇章

随着数字化转型的步伐不断加快,时尚界也在探索如何利用最新技术为消费者带来更加沉浸式的购物体验。在这一背景下,Google 推出了一项名为 FabricDiffusion 的新技术,这项技术能够将2D服装图像中的高质量织物纹理转移到任意形状的3D服装模型上,从而为3D虚拟试穿提供了更为真…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于AGCN-LSTM模型的海上风电场功率概率预测 》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…