操作系统 使用C语言实现生产者和消费者问题

2023-05-16

        生产者与消费者问题描述及原理在这里不赘述,这是用c语言简单实现了一下,加上代码不超过100行。

#include <stdio.h>
#include <windows.h>

#define N 10

typedef int semaphore;  /* 信号量是一种特殊的整型变量 */

 semaphore mutex=1;     /* 互斥访问 */
 semaphore empty=N;     /* 记录缓冲区中空的槽数 */
 semaphore full=0;      /* 记录缓冲区中满的槽数*/

 semaphore buf[N];      /* 有N个槽数的缓冲区buf[N],并实现循环缓冲队列 */
 semaphore front=0, rear=0;

  void p(semaphore *x)  /* p操作 */
 {
    *x=(*x)-1;
 }

 void v(semaphore *y)   /* v操作 */
 {
    *y=(*y)+1;
 }

  void produce_item(int *item_ptr)
 {
    /*printf("produce an item\n");*/
    *item_ptr='m';      /* 'm' is "man满" */
 }

 void enter_item(int x)
 {
    buf[front]=x;
    printf("输入了 %c 到缓冲区 buf[%d]\n", buf[front], front);
    front=(front+1)%N;
 }

void remove_item(int *yy)
{

    printf("从缓冲区  buf[%d] 取走 %c", rear,buf[rear]);

    *yy=buf[rear];
    buf[rear]='k';      /* 'k' is "kong空" */
    printf("  因此缓冲区 buf[%d] 变成空了,用%c表示\n", rear, buf[rear]);
    rear=(rear+1)%N;
}
void consume_item(int y)
{
    printf("消费从缓冲区取出的产品 %c\n", y);
}

void producer();
void consumer();

/* 生产者 */
void producer()
{
    int item;

    while(1){
        Sleep(1000);
        produce_item(&item);
        p(&empty);          /* 递减空槽数 */
        p(&mutex);          /* 进入临界区 */
        enter_item(item);   /* 将一个新的数据项放入缓冲区 */
        v(&mutex);          /* 离开临界区 */
        v(&full); /* 递增满槽数 */
        if(full==N)         /* 若缓冲区满的话,唤醒消费者进程 */
            consumer();
    }
}

/* 消费者 */
void consumer()
{
    int get_item;

    while(1){
        Sleep(1000);
            p(&full);           /* 递减满槽数 */
            p(&mutex);          /* 进入临界区 */
            remove_item(&get_item); /* 从缓冲区中取走一个数据项 */
            v(&mutex);          /* 离开临界区 */
            v(&empty);          /* 递增空槽数 */
            consume_item(get_item); /* 对数据项进行操作(消费)*/
            if(empty==N)        /* 若缓冲区全空的话,唤生产者进程 */
                producer();
    }
 }

 /* 调用生产者-消费者进程实现进程间同步 */
 int main()
{
    producer();
    return 0;
}

这段代码在模拟生产者与消费者问题时有个小bug,就是每次都是先是生产者往缓冲区里生产满了之后,消费者开始消费,等到消费完了之后,生产者又开始生产。

可以想到解决方法是用一个随机数来判断下一次操作是生产还是消费。后续再补充吧。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

操作系统 使用C语言实现生产者和消费者问题 的相关文章

  • window系统消失的c盘,实际占用与显示占用相差好多G

    问题 C盘一直显示的红色提醒 我c盘实际占用的空间只有33 1GB 而我的c盘总共大小是59 9GB 显示的剩余大小是1 35GB 也就是说我占用了58 11 和c盘的总文件大小相差了25GB 那么消失的25GB去了哪里 我百度过这个问题
  • plsql更改用户登录密码

    ORACLE数据库系统是美国ORACLE公司 甲骨文 提供的以分布式数据库为核心的一组软件产品 是目前最流行的客户 服务器 CLIENT SERVER 或B S体系结构的数据库之一 比如SilverStream就是基于数据库的一种中间件 O
  • texlive支持中文的简单方法

    1 确保tex文件的编码方式是UTF 8 2 在文档开始处添加一行命令即可 即 usepackage UTF8 ctex 如下所示 documentclass article usepackage UTF8 ctex begin artic
  • Tomcat7安装及配置教程

    Apache Tomcat7 0安装及配置教程 Apache Tomcat7 0官方网站链接 http tomcat apache org apache tomcat 7 0 73 windows x64 先解压下载的压缩包 然后在bin目
  • 文件管理系统(操作系统)——9张思维导图

    文件管理系统 1 文件管理 1 1 一个文件的逻辑结构 比如一个文本txt文件 又或者Excel文件 在我们用户看来 它是长什么样的 这个就是逻辑结构 几个概念 逻辑结构 就是指在用户看来 单个文件内部的数据应该是如何组织起来的 物理结构
  • Ubuntu 10.10下安装TFTP的步骤 tftp-hpa版本

    背景 由于想要在tq2440板子上用tftp下载kernel 所以要在自己的PC机的Ubuntu 10 10上安装tftp服务 所以就去网上找了些教程 但是很悲剧 按照那些教程去操作 结果还都是无法正常运行tftp服务 最后还是从一个外国人
  • 设备管理过程

    复杂度2 5 机密度2 5 最后更新2021 04 19 AIX中对设备会有如下五个操作 define aix下能看到设备的定义 但驱动程序并没有加载或初始化 该设备不可用 lsdev看到设备时defined 很多逻辑设备 vg lv等 只
  • gpuz怎么看显存颗粒

    gpuz可以帮助一些用户查看电脑的一切显卡参数 对于想要了解显卡的网友来说使用起来是非常方便的 不过有些网友是刚开始使用 还不知道gpuz怎么看显存颗粒 下面小编就教下大家gpuz查看显存颗粒的方法 首先 显存颗粒是显存的物理存储组成单元
  • Windows 添加永久静态路由

    route add p 10 10 0 0 mask 255 255 0 0 10 10 6 1 p 参数 p 即 persistent 的意思 p 表示将路由表项永久加入系统注册表
  • InfoQ视频直播分享报名:前贝尔实验室、Oracle架构师为你在线揭秘分布式平台内核...

    报名方式 关注InfoQ微信公众号 ID infoqchina 回复 InfoQ 即可观看在线直播技术分享 分享地点 u0026amp 时间 InfoQ直播微课堂将在熊猫 TV 网站播出 看腻了卖肉的女主播 来看看QCon 的明星讲师如何
  • 《一个操作系统的实现》读书笔记-- 第一章--最小的“操作系统”

    一 最简单的 操作系统 最最简单的 操作系统 就是一个最最简单的引导扇区 Boot Sector 虽然它不具有任何功能 但是它却能够直接在裸机上运行 不依赖其他软件 一个引导扇区是512个字节 并且以0xAA55为结束标识的扇区 下面就是那
  • Elasticsearch 日志

    下载并安装 Filebeat 首次使用 Filebeat 请参阅入门指南 复制代码片段 curl L O https artifacts elastic co downloads beats filebeat filebeat 7 2 0
  • Visual studio 2005 hangs on startup AppHangXProcB1 svchost devenv.exe svchost.exe:{2a811bb2-303b-48b...

    This problem has been torturing me for the whole afternoon and after searching on the web for a long time I finally get
  • [架构之路-185]-《软考-系统分析师》-3-操作系统基本原理 - 文件索引表

    目录 一 文件的索引块 二 索引分配表 三 索引表的链接方案 四 多层索引 五 混合索引分配 一 文件的索引块 存放在目录中的文件 并非是文件的真实内容 目录中记录了文件的索引块是几号磁盘块 文件对应的索引表是存放在指定的磁盘块中的 二 索
  • 内存管理——分页分段

    一 分页存储管理 1 页面与页框 1 页面 将一个进程的逻辑地址空间分成若干个大小相等的片 称为页面或页 并为各页加以编号 2 页框 相应于页面 把内存空间分成和页面相同大小的若干个存储块 称为 物理 块或页框 frame 3 页内碎片 在
  • Anaconda 安装 Python 库(MySQLdb)的方法-(转)

    安装python库的过程中 最重要的地方就是版本需要兼容 其中操作系统为64位 Python为2 X 64位 下载安装文件的时候也要注意版本匹配 其中文件名中包含的cp27表示CPython 2 7版本 cp34表示CPython 3 4
  • OS——文件管理系统磁盘的结构之搞清盘面和柱面

    如上图 每个柱面有三个盘面 即就是3个磁道 柱面可以抽象的理解成是一个套一个的立体的同心圆柱体 例 2019年408真题 磁盘有300个柱面 每个柱面有10个磁道 每个磁道有200个扇区 扇区大小为512B 则磁盘容量 分析 每个柱面有10
  • 由于回车符引起的shell错误

    今天弟弟写shell时出现一个错误 源代码如下 zip r 1 2 执行时出现错误 我也写了相同的语句 发现是可以执行的 把两个文件对比一看 差别在于 出错shell 正确shell 在linux下的回车是 n 在win下面的回车是 r n
  • 磁盘调度算法笔记和练习题

    磁盘调度算法 先来先服务FCFS 最短寻道时间优先SSTF 扫描调度SCAN 练习题 先来先服务FCFS 最短寻道时间优先SSTF 扫描调度SCAN 它是一次只响应一个方向上的请求 这个方向上的请求都响应完了 再掉头处理另一个方向上的 有点
  • CentOS Linux服务器安全设置

    转自 http www osyunwei com archives 754 html 引言 我们必须明白 最小的权限 最少的服务 最大的安全 所以 无论是配置任何服务器 我们都必须把不用的服务关闭 把系统权限设置到最小话 这样才能保证服务器

随机推荐

  • E: Package ‘cmake‘ has no installation candidate

    在ubuntu中使用 sudo apt get install cmake 报错 xff1a E Package 39 cmake 39 has no installation candidate 解决方法 xff1a sudo apt g
  • 函数程序设计实验五:打印购物小票

    module HaskellStore where import Text Printf type Items 61 Item type Item 61 Name Amount Price type Name 61 String type
  • CSS实战——百度搜索首页

    成果 支持搜索内容 步骤 一般来说 xff1a 使用css 43 div进行页面的布局 xff0c css一般是用外联进行开发使用html进行每一个页面的填充 注意事项 id的命名规范 xff1a 父标签id 自己的idcss一般一个选择器
  • UNIX环境高级编程

    环境配置 1 下载apue 3e文件夹 xff0c 可以通过http www apuebook com code3e html现在源码 2 解压后执行进入apue 3e中执行make指令 如果出现 96 96 96 collect2 err
  • 常见的亮灭屏流程分析

    一 亮屏主要关键log 驱动按键时间 lt 3 gt 14082 058160 0 70 pmic thread kpd Power Key generate pressed 61 1 上层按键时间 09 25 15 13 07 19666
  • 冒烟测试和回归测试的区别

    每次新的版本出来的时候 xff0c 老大就让我们 冒烟 虽然不知道冒烟测试的含义 xff0c 但由于没有给用例 xff0c 我就随便跑跑 跑完冒烟后 xff0c 老大就让做 回归测试 xff0c 把bug回归掉 但是其实对2个概念还是不太理
  • 老旧电脑在虚拟机安装ubuntu运行环境的步骤及注意事项

    花了一天的时间在我的老电脑上用虚拟机装上了ubuntu xff0c 多灾多难 xff0c 记录一下问题和注意事项 老电脑的配置 xff1a cpu xff1a Intel Core TM 2 Duo CPU E7500 64 2 93GHz
  • x11vnc

    x11vnc display 0 auth guess rfbport 5900 forever shared noxdamage noncache repeat amp auth 关窗口退出 auth guess 关窗口不退出 用户注销退
  • 多个生产者和消费者线程

    span class token comment 作者 xff1a kuma 版本 xff1a v1 0 span span class token keyword public span span class token keyword
  • C/C++ 开源库及示例代码

    C C 43 43 开源库及示例代码 说明 本页面汇总俺收集的各种 C 和 C 43 43 的开源代码库 xff0c 不定期更新 如果你发现本页面的开源库有错漏之处 xff0c 非常欢迎给俺提供反馈 有 GitHub 帐号的同学 xff0c
  • UEFI分区的重建办法,不需要额外软件

    如果你的EFI分区还在 只是被破坏需要修复的话 xff0c 执行 bcdboot c windows l cn zh 即可 xff0c c是Windows安装的盘符 xff0c 如果是装机工具启动可能window的分区不是显示的c 如果连E
  • powershell 设置环境变量

    cmd 是用set 导出变量 xff0c 到了powershell中不好使了 xff0c 下面介绍下导出变量的方法 xff0c 比如想设置 ETCDCTL API 61 3 在powershell中执行下面命令就可以了 Env ETCDCT
  • Httpd 服务

    httpd服务 1 httpd服务简介 Apache HTTP Server xff08 简称Apache或httpd xff09 是Apache软件基金会的一个开放源代码的网页服务器软件 xff0c 旨在为unix xff0c windo
  • Lottie—json文件解析

    Lottie主要类图 xff1a Lottie对外通过控件LottieAnimationView暴露接口 xff0c 控制动画 LottieAnimationView继承自ImageView xff0c 通过当前时间绘制canvas显示到界
  • Android中获取应用程序(包)的信息-----PackageManager的使用

    Android系统为我们提供了很多服务管理的类 xff0c 包括ActivityManager PowerManager 电源管理 AudioManager 音频管理 等 除此之外 xff0c 还提供了一个PackageManger管理类
  • Android开发与调试二:串口uart Debug

    安卓智能硬件开发板 xff0c 往往会预留一个 uart口 xff0c 串口的形式打出 log出来 xff0c 便于我们开发的时候 debug 工具 xff1a 1个 FT232的模块 xff08 如下图 xff0c 淘宝有卖 xff09
  • 正则表达式以及Java中的一个正则表达式处理库

    如果你不熟悉这个术语 xff0c 那么 正则表达式 xff08 Regular Expression xff09 就是一个字符构成的串 xff0c 它定义了一个用来搜索匹配字符串的模式 正则表达式30分钟入门教程 常用正则表达式 许多语言
  • Ubuntu包安装问题(E: Broken packages)[2014-01-03更新]

    问题描述 使用apt get安装软件包时不能正确安装 xff0c 出现提示如下 xff1a apt get install libgtk2 0 dev Reading package lists Done Building dependen
  • c#文案语音配图片一键生成视频

    高手略过吧 xff0c 功能太简单 xff0c 我自己都不好意思 这个是我自己的需要 xff0c 做产品类的短视频 xff0c 东搞西搞剪辑啊啥的 xff0c 特别麻烦 xff0c 所以先搞这个最简版 xff0c 以后再一步步丰富功能 需求
  • 操作系统 使用C语言实现生产者和消费者问题

    生产者与消费者问题描述及原理在这里不赘述 xff0c 这是用c语言简单实现了一下 xff0c 加上代码不超过100行 include lt stdio h gt include lt windows h gt define N 10 typ