操作系统中的信号量机制问题某车站售票厅,任何时刻最多可容纳2-查字典问答网
分类选择

来自万继光的问题

  操作系统中的信号量机制问题某车站售票厅,任何时刻最多可容纳20名购票者进入,当售票厅中少于20名购票者时,厅外的购票者可立即进入,否则需要在外面等待.每个购票者可看成一个进程.要求

  操作系统中的信号量机制问题

  某车站售票厅,任何时刻最多可容纳20名购票者进入,当售票厅中少于20名购票者时,厅外的购票者可立即进入,否则需要在外面等待.每个购票者可看成一个进程.

  要求:再写C语言代码要完整的

1回答
2020-11-13 05:29
我要回答
请先登录
郭芸俊

  一、问题描述

  生产者-消费者问题是一个经典的进程同步问题,该问题最早由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

2020-11-13 05:31:48

最新问答

推荐文章

猜你喜欢

附近的人在看

推荐阅读

拓展阅读

  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  •