操作系统中的信号量机制问题某车站售票厅,任何时刻最多可容纳20名购票者进入,当售票厅中少于20名购票者时,厅外的购票者可立即进入,否则需要在外面等待.每个购票者可看成一个进程.要求
操作系统中的信号量机制问题
某车站售票厅,任何时刻最多可容纳20名购票者进入,当售票厅中少于20名购票者时,厅外的购票者可立即进入,否则需要在外面等待.每个购票者可看成一个进程.
要求:再写C语言代码要完整的
操作系统中的信号量机制问题某车站售票厅,任何时刻最多可容纳20名购票者进入,当售票厅中少于20名购票者时,厅外的购票者可立即进入,否则需要在外面等待.每个购票者可看成一个进程.要求
操作系统中的信号量机制问题
某车站售票厅,任何时刻最多可容纳20名购票者进入,当售票厅中少于20名购票者时,厅外的购票者可立即进入,否则需要在外面等待.每个购票者可看成一个进程.
要求:再写C语言代码要完整的
一、问题描述
生产者-消费者问题是一个经典的进程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制.
他要求设计在同一个进程地址空间内执行的两个线程.
生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费.
消费者线程从缓冲区中获得物品,然后释放缓冲区.
当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区.
当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来.
同理本问题也是要求设计在同一个进程地址空间内执行的两个线程.
当车站售票厅达到20人上线时,必须等有人走出车站售票厅,车站售票厅外的购票者才可进入.就如上面
生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区.此时厅外购票者进入大厅这个事件可以看做是一个生产者线程,而厅内购票者走出厅外这个事件就可以看做是一个消费者线程.如此问题迎刃而解.
二、实现代码
#include
#include
constunsignedshortSIZE_OF_BUFFER=10;//缓冲区长度
unsignedshortProductID=0;//产品号
unsignedshortConsumeID=0;//将被消耗的产品号
unsignedshortin=0;//产品进缓冲区时的缓冲区下标
unsignedshortout=0;//产品出缓冲区时的缓冲区下标
intg_buffer[SIZE_OF_BUFFER];//缓冲区是个循环队列
boolg_continue=true;//控制程序结束
HANDLEg_hMutex;//用于线程间的互斥
HANDLEg_hFullSemaphore;//当缓冲区满时迫使生产者等待
HANDLEg_hEmptySemaphore;//当缓冲区空时迫使消费者等待
DWORDWINAPIProducer(LPVOID);//生产者线程
DWORDWINAPIConsumer(LPVOID);//消费者线程
intmain()
{
//创建各个互斥信号
g_hMutex=CreateMutex(NULL,FALSE,NULL);
g_hEmptySemaphore=CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL);
//调整下面的数值,可以发现,当生产者个数多于消费者个数时,
//生产速度快,生产者经常等待消费者;反之,消费者经常等待
constunsignedshortPRODUCERS_COUNT=3;//生产者的个数
constunsignedshortCONSUMERS_COUNT=1;//消费者的个数
//总的线程数
constunsignedshortTHREADS_COUNT=PRODUCERS_COUNT+CONSUMERS_COUNT;
DWORDproducerID[CONSUMERS_COUNT];//生产者线程的标识符
DWORDconsumerID[THREADS_COUNT];//消费者线程的标识符
//创建生产者线程
for(inti=0;i