题目
操作系统中的信号量机制问题
某车站售票厅,任何时刻最多可容纳20名购票者进入,当售票厅中少于20名购票者时,厅外的购票者可立即进入,否则需要在外面等待.每个购票者可看成一个进程.
要求:再写C语言代码 要完整的
某车站售票厅,任何时刻最多可容纳20名购票者进入,当售票厅中少于20名购票者时,厅外的购票者可立即进入,否则需要在外面等待.每个购票者可看成一个进程.
要求:再写C语言代码 要完整的
提问时间:2021-02-27
答案
一、问题描述
生产者-消费者问题是一个经典的进程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制.
他要求设计在同一个进程地址空间内执行的两个线程.
生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费.
消费者线程从缓冲区中获得物品,然后释放缓冲区.
当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区.
当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来.
同理 本问题也是要求设计在同一个进程地址空间内执行的两个线程.
当车站售票厅达到20人上线时,必须等有人走出车站售票厅,车站售票厅外的购票者才可进入.就如上面
生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区.此时厅外购票者进入大厅这个事件可以看做是一个生产者线程,而厅内购票者走出厅外这个事件就可以看做是一个消费者线程.如此问题迎刃而解.
二、实现代码
#include
#include
const unsigned short SIZE_OF_BUFFER = 10; //缓冲区长度
unsigned short ProductID = 0; //产品号
unsigned short ConsumeID = 0; //将被消耗的产品号
unsigned short in = 0; //产品进缓冲区时的缓冲区下标
unsigned short out = 0; //产品出缓冲区时的缓冲区下标
int g_buffer[SIZE_OF_BUFFER]; //缓冲区是个循环队列
bool g_continue = true; //控制程序结束
HANDLE g_hMutex; //用于线程间的互斥
HANDLE g_hFullSemaphore; //当缓冲区满时迫使生产者等待
HANDLE g_hEmptySemaphore; //当缓冲区空时迫使消费者等待
DWORD WINAPI Producer(LPVOID); //生产者线程
DWORD WINAPI Consumer(LPVOID); //消费者线程
int main()
{
//创建各个互斥信号
g_hMutex = CreateMutex(NULL,FALSE,NULL);
g_hEmptySemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL);
//调整下面的数值,可以发现,当生产者个数多于消费者个数时,
//生产速度快,生产者经常等待消费者;反之,消费者经常等待
const unsigned short PRODUCERS_COUNT = 3; //生产者的个数
const unsigned short CONSUMERS_COUNT = 1; //消费者的个数
//总的线程数
const unsigned short THREADS_COUNT = PRODUCERS_COUNT+CONSUMERS_COUNT;
DWORD producerID[CONSUMERS_COUNT]; //生产者线程的标识符
DWORD consumerID[THREADS_COUNT]; //消费者线程的标识符
//创建生产者线程
for (int i=0;i
生产者-消费者问题是一个经典的进程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制.
他要求设计在同一个进程地址空间内执行的两个线程.
生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费.
消费者线程从缓冲区中获得物品,然后释放缓冲区.
当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区.
当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来.
同理 本问题也是要求设计在同一个进程地址空间内执行的两个线程.
当车站售票厅达到20人上线时,必须等有人走出车站售票厅,车站售票厅外的购票者才可进入.就如上面
生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区.此时厅外购票者进入大厅这个事件可以看做是一个生产者线程,而厅内购票者走出厅外这个事件就可以看做是一个消费者线程.如此问题迎刃而解.
二、实现代码
#include
#include
const unsigned short SIZE_OF_BUFFER = 10; //缓冲区长度
unsigned short ProductID = 0; //产品号
unsigned short ConsumeID = 0; //将被消耗的产品号
unsigned short in = 0; //产品进缓冲区时的缓冲区下标
unsigned short out = 0; //产品出缓冲区时的缓冲区下标
int g_buffer[SIZE_OF_BUFFER]; //缓冲区是个循环队列
bool g_continue = true; //控制程序结束
HANDLE g_hMutex; //用于线程间的互斥
HANDLE g_hFullSemaphore; //当缓冲区满时迫使生产者等待
HANDLE g_hEmptySemaphore; //当缓冲区空时迫使消费者等待
DWORD WINAPI Producer(LPVOID); //生产者线程
DWORD WINAPI Consumer(LPVOID); //消费者线程
int main()
{
//创建各个互斥信号
g_hMutex = CreateMutex(NULL,FALSE,NULL);
g_hEmptySemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL);
//调整下面的数值,可以发现,当生产者个数多于消费者个数时,
//生产速度快,生产者经常等待消费者;反之,消费者经常等待
const unsigned short PRODUCERS_COUNT = 3; //生产者的个数
const unsigned short CONSUMERS_COUNT = 1; //消费者的个数
//总的线程数
const unsigned short THREADS_COUNT = PRODUCERS_COUNT+CONSUMERS_COUNT;
DWORD producerID[CONSUMERS_COUNT]; //生产者线程的标识符
DWORD consumerID[THREADS_COUNT]; //消费者线程的标识符
//创建生产者线程
for (int i=0;i
举一反三
已知函数f(x)=x,g(x)=alnx,a∈R.若曲线y=f(x)与曲线y=g(x)相交,且在交点处有相同的切线,求a的值和该切线方程.
我想写一篇关于奥巴马的演讲的文章,写哪一篇好呢?为什么好
奥巴马演讲不用看稿子.为什么中国领导演讲要看?
想找英语初三上学期的首字母填空练习……
英语翻译
最新试题
- 1鹅和羊共有35只,合计脚数100只,鹅和羊各有几只
- 2用息息相通和层出不穷造句
- 3一层药水五小瓶药水一大瓶一中瓶每小瓶200克二层五小瓶三中瓶三层8小瓶1大瓶每层药水重量相等大中瓶多少克
- 4世界是处在不断的历史发展中的物质,这是什么观点?
- 5三个英文字母的单词 汉语意思好听的
- 6英国各个时期的文学家
- 7什么气体可以吸收太阳能
- 8某列车通过250米长的隧道用25秒,通过210米的铁桥用23秒,若该列车与另一列长150米.速度为20米每秒的列车相
- 92010年4月2日,丹麦国宝级青铜雕塑“小美人鱼”运抵上海,成为世博会丹麦馆的镇馆之宝,铜像中美人鱼身高1.5米,基石直径1.8米.求(1)若青铜由铜锡约按质量比为3:1熔合而成,则青铜密度多少(已知
- 10古人如何利用影子的变化表示时间
热门考点
- 1求助一分析化学设计实验《KMnO4测定Ca2+含量》
- 2急,在先等,一道英语选择题,不要乱讲,追悬丰厚
- 3某商场将每件进价为120元的女士夏装以130元售出平均每月可销售600件调查表明一件这种夏装
- 420摄氏度时,将180克饱和氯化钠溶液加热,蒸发25克水,析出9克氯化钠,则20℃时氯化钠的溶解度是
- 5常见的恒星和行星有哪些
- 6如图,△ABC是面积为a的等边三角形,AD是BC边上的高,点E、F是AD上的两点.则图中阴影部分的面积为_.
- 7据统计,全球每分钟约有8500000t污水排入江河湖海,求一天全球排入江河河海的污水共有多少吨?
- 8写字拼音怎么拼
- 9向量的数量积*2
- 10生物题:种植农作物时,为让阳光尽量的多照射到农作物,以利于提高产量,应该