【操作系统】c语言--使用信号量解决生产者和消费者问题

news2024/11/28 22:09:39

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c++系列专栏:C/C++零基础到精通 🔥

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

在这里插入图片描述

c语言内容💖:

专栏:c语言之路重点知识整合

【c语言】全部知识点总结


目录

  • 信号量
  • 分析
  • 代码
  • 运行结果

信号量

信号量是一种同步机制,可用于保护共享资源,控制进程的访问以及协调进程之间的通信。

在生产者和消费者问题中,可以使用两个信号量:一个用于生产者,另一个用于消费者。

假设缓冲区的大小为N,生产者信号量的初始值为N,消费者信号量的初始值为0。

接下来,生产者和消费者可以使用P操作和V操作来访问缓冲区。

P操作(等待信号量):如果信号量的值为0,则进程将阻塞,直到信号量的值变为正数。如果信号量的值大于0,则进程将减少信号量的计数器并继续执行。

V操作(释放信号量):如果有进程在等待信号量,则唤醒其中一个进程。否则,信号量的计数器将增加,以表示一个资源已经可用。

分析

创建两个线程,一个用于生产者,另一个用于消费者。它们共享一个大小为5的环形缓冲区。

当生产者线程生成一个新项目时,它使用blank_number信号量将空闲空间的数量减少1,然后使用互斥变量mutex1添加到环形缓冲区中。生产者使用product_number信号量将队列项目的数量增加1。

当消费者线程消费一个项目时,它使用product_number信号量将队列项目的数量减少1,然后使用互斥变量mutex1从环形缓冲区中删除。消费者使用blank_number信号量将空余的空间数量增加1。

这种基于信号量的方法可以保证生产者和消费者之间的同步性。

  • 如果缓存区已满,则生产者线程将在blank_number信号量处阻塞,并等待直至有可用的空间。

  • 如果缓存区为空,则消费者线程将在product_number信号量处阻塞。

代码

#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <stdio.h>
#include <semaphore.h>

#define NUM 5

int queue[NUM];                                     //全局数组实现环形队列
sem_t blank_number, product_number, mutex1;                 //空格子信号量, 产品信号量

void *producer(void *arg)
{
    int i = 0;

    while (1) {
        sem_wait(&blank_number);                    //生产者将空格子数--,为0则阻塞等待
        sem_wait(&mutex1);
        queue[i] = rand() % 1000 + 1;               //生产一个产品
        printf("----Produce---%d\n", queue[i]);
        sem_post(&mutex1);
        sem_post(&product_number);                  //将产品数++

        i = (i+1) % NUM;                            //借助下标实现环形
        sleep(rand()%3);
    }
}

void *consumer(void *arg)
{
    int i = 0;

    while (1) {
        sem_wait(&product_number);                  //消费者将产品数--,为0则阻塞等待
        sem_wait(&mutex1);
        printf("-Consume---%d\n", queue[i]);
        queue[i] = 0;                               //消费一个产品
        sem_post(&mutex1);
        sem_post(&blank_number);                    //消费掉以后,将空格子数++

        i = (i+1) % NUM;
        sleep(rand()%3);
    }
}

int main(int argc, char *argv[])
{
    pthread_t pid, cid;

    sem_init(&blank_number, 0, NUM);                //初始化空格子信号量为5
    sem_init(&product_number, 0, 0);                //产品数为0
    sem_init(&mutex1, 0, 1);

    pthread_create(&pid, NULL, producer, NULL);
    pthread_create(&cid, NULL, consumer, NULL);

    pthread_join(pid, NULL);
    pthread_join(cid, NULL);

    sem_destroy(&blank_number);
    sem_destroy(&product_number);

    return 0;
}

运行结果

在这里插入图片描述


在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)

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

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

相关文章

Vue--》Vue3打造可扩展的项目管理系统后台的完整指南(九)

今天开始使用 vue3 ts 搭建一个项目管理的后台&#xff0c;因为文章会将项目的每一个地方代码的书写都会讲解到&#xff0c;所以本项目会分成好几篇文章进行讲解&#xff0c;我会在最后一篇文章中会将项目代码开源到我的GithHub上&#xff0c;大家可以自行去进行下载运行&…

Eclipse配置JVM启动参数

【参考】Eclipse设置jvm参数的三种方式

git、gitlab、github在windows下通用的操作笔记

前言&#xff1a;命令是在Git Bash 下输入的命令&#xff0c;GUI部分涉及到小乌龟git&#xff0c;可以自行安装&#xff0c;不同版本有差异&#xff0c;用git的新手也可以尝试 SourceTree 提供漂亮的图形化界面操作&#xff08;但是卡顿坑多&#xff0c;需三思&#xff09; 1、…

7月11入伏,进入三伏天dog days

三伏天&#xff0c;是一年中最热的日子,今年的三伏天始于7月11日。sanfu, the hottest time of the year begins on July 11th this year. 三伏&#xff0c;也称为中国的dog days,预示着一年中最热的三个阶段&#xff0c;每一阶段大约有10-20天。Sanfu, also called Chinas &qu…

基于FreeRTOS的嵌入式设备管理关键技术研究及实现(学习五重要)

操作系统任务框架 系统任务 空闲任务几乎存在于所有的嵌入式实时操作系统&#xff0c;用户无法自行关闭空闲任务。 空闲任务的作用主要是减少核心芯片的使用率&#xff0c;避免核心芯片的负载压力过大&#xff0c;保证系统的低功耗运行。 时钟节拍任务控制系统的延时函数和等待…

matlab画拟合直方图的脚本

都是一些简单的作图参数&#xff0c;可以自己按照matlab官方的指导去改style https://ww2.mathworks.cn/help/stats/histfit.html %-----------------------------------------------------------------------------------------------------------% %-----Function: Plot a h…

Proteus8.15 安装包下载及详细安装

Proteus8.15 安装包下载及详细安装 1.安装包链接&#xff0c;需要可自取&#xff0c;也可自行去官方下载最新版本 链接: https://pan.baidu.com/s/1Zcdr1hFo2RHCw88CXtY2bQ?pwdbuz6 提取码: buz6 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 –来自百度网盘超…

Redis 高可用和优化(主从复制、哨兵、集群)

目录 一&#xff1a;Redis 高可用 二&#xff1a; Redis 持久化 1、持久化的功能 2、Redis 提供两种方式进行持久化 3、 RDB 持久化 &#xff08;1&#xff09;触发条件 &#xff08;1.1&#xff09;手动触发 &#xff08;1.2&#xff09;自动触发 &#xff08;1.3&am…

[SSM]MyBatis常用技巧和参数处理

目录 八、MyBatis小技巧 8.1#{}和${} 8.2别名机制&#xff1a;typeAliases 8.3mappers ​编辑 8.4IDEA配置文件模板 8.5插入数据时获取自动生成的主键 九、MyBatis参数处理 9.1单个简单参数类型 9.2Map参数 9.3实体类参数 9.4多参数 9.5Param注解&#xff08;命名…

面向对象五大基本原则

面向对象五大基本原则 更多精彩 先案例后讲解&#xff0c;这里是代码教父&#xff0c;今天讲解面向对象的五大基本原则&#xff1a; 单一职责原则&#xff08;The Single Responsibility Principle&#xff09;开闭原则&#xff08;The Open-Closed Principle&#xff09;里氏…

javassit 01

Javassist&#xff1a; Javassist是一个开源的分析、编辑和创建Java字节码的类库。是由东京工业大学的数学和计算机科学系的 Shigeru Chiba &#xff08;千叶 滋&#xff09;所创建的。它已加入了开放源代码JBoss 应用服务器项目&#xff0c;通过使用Javassist对字节码操作为JB…

Java SSM 重制版(三)SpringSecurity

SpringSecurity 基于Spring6的重制版&#xff0c;截止目前&#xff0c;最新的版本是6.1.1版本。 前置课程&#xff1a;《Spring核心内容》《SpringMvc》《JavaWeb》《Java9-17新特性》 安全是开发者永远绕不开的话题&#xff0c;一个不安全的网站&#xff0c;往往存在着各种…

主机与虚拟机ubuntu网络无法ping通问题

一. 主机与虚拟机无法ping通问题 在嵌入式开发中&#xff0c;经过会涉及网络方面的问题。最常用到的是开发板在 虚拟机&#xff08;ubuntu&#xff09;通过NFS服务挂载到ubuntu中&#xff0c;这里就涉及网络是否可以ping通问题。 开发板 ping 通 ubuntu虚拟机系统的前提&…

基于matlab使用视频和深度学习进行手势识别(附源码)

一、前言 此示例首先演示如何使用预训练的SlowFast视频分类器执行手势识别&#xff0c;然后演示如何使用迁移学习在自定义手势识别数据集上训练分类器。 基于视觉的人类手势识别涉及使用一组视频帧预测手势&#xff0c;例如挥手打招呼、手语手势或鼓掌。手势识别的一个吸引人…

启动失败之源发行版 17 需要目标发行版 17

一、java: 警告: 源发行版 17 需要目标发行版 17 1.1.原因 :JDK 版本不对。 这里可以看到&#xff0c;项目需要的是JDK17&#xff0c;而我这里用的是JDK1.8。 1.2.修改 这里有两种操作&#xff0c;一种是修改项目版本&#xff0c;一种是修改JDK版本。无论是哪一种&#xff0…

CentOS7使用ping命令测试主机或者外部网络不通(已解决)

CentOS7使用ping命令测试主机或外部网路显示“目标主机不可达”或者其他原因失败。 说明 当尝试了所有修改配置&#xff0c;关闭防火墙等操作之后&#xff0c;还是没有成功的条件下。 查看计算机中的VMware相关的服务是否打开。 此电脑–右击–管理–服务与应用程序–服务 …

【小吉带你学Git】Git命令(用户签名,本地库,暂存区,文件,版本 等命令)

&#x1f38a;专栏【Git】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 &#x1f33a;欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f354;设置用户签名⭐命令⭐如何在Windows上面查看自己的签名 &am…

eNSP-静态路由表的配置

eNSP-静态路由表的配置 文章目录 eNSP-静态路由表的配置一、拓扑结构二、关键语句三、完整代码四、测试验证 一、拓扑结构 二、关键语句 ip route-static x.x.x.x y z.z.z.z 语法&#xff1a;目标网段 掩码 下一跳 例如 PC1所在网段访问PC2所在网段 在AR1中输入 ip route-st…

scratch 鼠标控制角色移动

scratch 鼠标控制角色 本程序使用鼠标操作“机器人”角色跟随鼠标&#xff0c;距离较小时暂停移动&#xff1b;“小狗”角色连续在随机位置生成、水平移动、碰到边缘反弹、碰到“机器人”角色时删除。 目前scratch程序的制作已经告一段落了&#xff0c;进一步开发需要更多规划…

Redis【实战篇】---- 达人探店

Redis【实战篇】---- 达人探店 1. 达人探店 - 发布探店笔记2. 达人探店 - 查看探店笔记3. 达人探店 - 点赞功能4. 达人探店 - 点赞排行榜 1. 达人探店 - 发布探店笔记 发布探店笔记 探店笔记类似点评网站的评价&#xff0c;往往是图文结合。对应的表有两个&#xff1a; tb_bl…