Linux多线程——POSIX信号量与环形队列版本之生产消费模型

文章目录

POSIX信号量

POSIX信号量和System V信号量是不同的标准

但是实现的功能是一样的,都是为了解决同步的问题

我们说信号量指的就是资源的数量

在生产者与消费者模型里面,生产者与消费者所认为的资源是不同的

生产者认为空间是资源,因为每次都要往里面放东西,空间会变少

消费者认为数据是资源,因为每次都会拿东西,数据会变少

POSIX的操作

初始化
cpp 复制代码
#include<semaphore.h>
int sem_init(sem_t *sem, int pshared, unsigned int value);

第一个是声明的信号量,第二个是选项,0表示线程间共享,非0表示进程间共享,第三个表示信号量的初始值

销毁
cpp 复制代码
int sem_destory(sem_t *sem);
等待信号量(申请资源)

申请资源就是P操作

cpp 复制代码
int sem_wait(sem_t* sem);
发布信号量(放下资源)

发布信号量就是V操作

cpp 复制代码
int sem_post(sem_t* sem);

环形队列之生产消费模型

上一篇文章的生产消费模型是基于阻塞队列的,而且只用了互斥同步锁的内容,我们感觉效率其实不高,因为需要频繁考虑互斥同步问题

如果使用一个环形队列,那就只用在生产者和消费者碰头的时候考虑同步互斥问题

起始时刻,队列为空

生产者的信号量为n

消费者的信号量为0

如果队列为空,需要让生产者先运行

如果队列为满,需要让消费者先运行

除此之外,还需要互斥锁,因为消费者之间和生产者之间也需要互斥访问

相关推荐
wuminyu33 分钟前
JVM执行引擎学习总结:热点字节码编译成本地机器码
java·linux·c语言·jvm·c++
kiros_wang40 分钟前
通用工具模块封装:防抖节流、参数校验公共工具类
linux·运维·ubuntu
honsor1 小时前
以太网温湿度传感器|动环监控核心采集设备,协议、组网、Zabbix接入实战
linux·服务器·ubuntu
Android系统攻城狮1 小时前
Linux FFmpeg深度解析之avcodec_default_get_buffer2调用流程与实战(二十)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频
深圳恒讯1 小时前
香港云主机硬盘满了怎么办?Linux和Windows在线扩容操作教程
linux·运维·windows
程序员大阳1 小时前
副队长JavaScript教程(67)-Ajax初识:背景、历史与核心概念
javascript·ajax·同步·异步·概念·背景·来是
Android系统攻城狮1 小时前
Linux FFmpeg深度解析之av_parser_init调用流程与实战(二十一)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频
HideF1 小时前
Linux 查看用户和组
linux
寺中人2 小时前
CentOS 7进程与任务管理
linux·运维·centos·服务器搭建与管理·linux运维命令·nohup screen
隔振降噪研究员2 小时前
裁断机一响,楼板为什么会跟着抖?
大数据·linux·数据库·人工智能