当前位置: 首页 > news >正文

POSIX信号量

目录

一、相关概念回顾

1.信号量

2.多线程使用资源的两种情况

3.P操作和V操作

二、CP && 基于环形队列的生产者消费者模型

1.环形队列的介绍

​编辑

2.基于环形队列的生产者消费者模型的默认规则(通过信号量实现规则的成立)

3.相关的结论

4.单生产单消费的生产者消费者模型的实现思路

三、相关接口介绍

1.int sem_init(sem_t *sem, int pshared, unsigned int value);

2.int sem_destroy(sem_t *sem);

3.int sem_wait(sem_t *sem);

4.int sem_post(sem_t *sem);


一、相关概念回顾

1.信号量

<1>作用:表明临界资源数量的多少

<2>本质

说法一:本质是一个计数器,是对特定资源的预定机制

说法二:信号量的本质也是临界资源

2.多线程使用资源的两种情况

<1>将目标资源整体使用【mutex 或 2元信号量】

<2>将目标资源按照不同的“块”,分批使用

3.P操作和V操作

<1>P操作本质是--,是原子的

<2>V操作本质是++,是原子的

二、CP && 基于环形队列的生产者消费者模型

1.环形队列的介绍

<1>环形队列为空时:head==tail

环形队列为满时:head==tail

<2>解决该冲突的方法

方法一:利用计数器count

方法二:空一个位置,让head==tail时为空,tail+1==head时为满

2.基于环形队列的生产者消费者模型的默认规则(通过信号量实现规则的成立)

<1>当为空时,只能让生产者先运行

<2>当为满时,只能让消费者先运行

<3>生产者不能把消费者套一个圈以上

<4>消费者不能超过生产者

3.相关的结论

<1>这要生产者和消费者不访问同一位置(即为空或为满时),他们两者就可同时运行

<2>为空:只能【互斥】生产者先【同步】运行

为满:只能【互斥】消费者先【同步】运行

<3>为空或为满时,生产者和消费者需要同步或互斥

4.单生产单消费的生产者消费者模型的实现思路

生产者Equeue()消费者Pop()
资源:空的位置有效数据
sem_blank=Nsem_data=0
int p_step=0int c_step=0
P(sem_blank);//sem_blank--(申请信号量)P(sem_data);//sem_data--(申请信号量)
在p_step处进行生产(生产)在c_step处进行消费(消费)
p_step++;(更新下标)c_step++;(更新下标)
p_step%=N;(维持环形特性)c_step%=N;(维持环形特性)
V(sem_data);//sem_data++V(sem_blank);//sem_blank++

注:若要进行加锁,应该在申请信号量与生产/消费间进行加锁,在维持环形队列特性的操作后进行解锁

三、相关接口介绍

1.int sem_init(sem_t *sem, int pshared, unsigned int value);

<1>头文件:<semaphore.h>

<2>功能:初始化信号量

<3>参数:

sem:指向要要初始化信号量的指针

pshared:指定信号量是否在进程或线程之间共享

value:信号量的初始值(可用资源的数量)

<4>返回值:成功返回0,失败返回-1

2.int sem_destroy(sem_t *sem);

<1>头文件:<semaphore.h>

<2>功能:clean up an unnamed semaphore initialized with sem_init

<3>参数:sem:指向要要初始化信号量的指针

<4>返回值:成功返回0,失败返回-1

3.int sem_wait(sem_t *sem);

<1>头文件:<semaphore.h>

<2>功能:POSIX 线程库中用于操作信号量的函数,用于对信号量进行 P 操作如果信号量的值大于零,sem_wait 会将其减一并立即返回;如果信号量的值为零,调用线程会阻塞,直到信号量的值变为正数。

<3>参数:sem:指向要要初始化信号量的指针

<4>返回值:成功返回0,失败返回-1

4.int sem_post(sem_t *sem);

<1>头文件:<semaphore.h>

<2>功能: POSIX 线程库中用于操作信号量的函数,用于对信号量进行 V 操作。它会增加信号量的值,如果有线程因等待该信号量而被阻塞,其中一个线程会被唤醒。

<3>参数:sem:指向要要初始化信号量的指针

<4>返回值:成功返回0,失败返回-1

相关文章:

  • Kubernetes生产实战(二十七):精准追踪Pod数据存储位置
  • I2C通讯
  • springboot3+vue3融合项目实战-大事件文章管理系统-参数校验优化
  • 【RAG】11种Chunking Strategies分块策略介绍和选择
  • 工具篇-扣子空间MCP,一键做游戏,一键成曲
  • C语言中#include引用头文件的尖括号和双引号的区别
  • 【音视频工具】ffplay介绍
  • 线程的一些事(2)
  • 动态路由实现原理及前端控制与后端控制的核心差异
  • ‌中继器:网络中的“血包”与“加时器”‌
  • Ollama部署使用以及模型微调和本地部署
  • C++ stl中的set、multiset、map、multimap的相关函数用法
  • 计算机的三个根本性基础
  • Maven 公司内部私服中央仓库搭建 局域网仓库 资源共享 依赖包构建共享
  • 最长字符串 / STL+BFS
  • #微调重排序模型:Reranking从入门到实践
  • Dockerfile 完全指南:从入门到最佳实践
  • Linux 第七讲 --- 工具篇(二)gcc/g++与文件编译
  • 自然语言处理 (NLP) 入门:NLTK 与 SpaCy 的初体验
  • 北斗导航 | 深度学习与北斗导航定位算法结合思路、原理、公式、Python+matlab代码
  • “典孝急乐批麻蚌赢”:互联网“八字真言”与当代赛博赢学
  • 优化营商环境,服务上海“五个中心”建设,北外滩有何举措?
  • 筑牢安全防线、提升应急避难能力水平,5项国家标准发布
  • “救护车”半路加价?陕西卫健委已介入,记者调查:黑救护车挤占市场
  • AI观察|从万元到百万元,DeepSeek一体机江湖混战
  • 中美大幅下调超100%关税,印巴四日“战争”复盘|907编辑部