操作系统 使用C语言实现生产者和消费者问题
来源:互联网 发布:基金理财 知乎 编辑:程序博客网 时间:2024/05/13 15:55
生产者与消费者问题描述及原理在这里不赘述,这是用c语言简单实现了一下,加上代码不超过100行。
#include <stdio.h>#include <windows.h>#define N 10typedef 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,就是每次都是先是生产者往缓冲区里生产满了之后,消费者开始消费,等到消费完了之后,生产者又开始生产。
可以想到解决方法是用一个随机数来判断下一次操作是生产还是消费。后续再补充吧。
阅读全文
0 0
- 操作系统 使用C语言实现生产者和消费者问题
- 生产者和消费者问题c++(操作系统)
- 生产者消费者问题 伪代码和C语言多线程实现
- C语言实现生产者-消费者问题
- 生产者消费者问题---C语言实现
- 生产者-消费者问题及C语言实现
- 操作系统:使用临界区和互斥量两种方法实现简单生产者与消费者问题
- 生产者-消费者问题实现 (linux下C语言)
- 生产者-消费者问题实现 (linux下C语言)
- unix下用C语言实现的生产者消费者问题
- 生产者-消费者问题实现 (linux下C语言)
- 操作系统:生产者-消费者问题
- 操作系统 生产者消费者问题
- 操作系统:生产者消费者问题
- 【操作系统】【学习】生产者和消费者问题
- 操作系统生产者和消费者python3实现
- c语言描述生产者消费者问题
- linux下c语言生产者消费者问题
- 2017年10月17日8公司连续三个季度净利润同比增幅均超过50%持续高速增长
- C语言关键字 数据类型 流程控制
- STM32学习之:定时器时间计算
- 利用for循环输出100-999之间的水仙花数
- 代码模块化和可读性的tradeoff
- 操作系统 使用C语言实现生产者和消费者问题
- Linux快捷键命令
- STM32-UCOS学习笔记2
- 转载--一篇关于java中final关键字的很详细的文章
- python翻译小软件
- ECharts2.0报错'__animators' of undefined原因
- 创建类Person和对象
- CTF 实验吧 头有点大
- 第七周——项目二—数据结构之自建算法库——链队(链式队列)