C 语言的打瞌睡的理发师问题解决方案

2024 年 8 月 28 日 | 3 分钟阅读

睡着的理发师困境最早由Dijkstra在1965年提出。这个问题基于一个虚构的情境:一家理发店里只有一名理发师。理发店的等候区和工作区分开。顾客可以在等候区等待,有n个座位;然而,工作区只有一个理发椅。

进程间通信

虽然一个协作进程可能会受到正在运行的其他进程的影响,但一个独立进程不受其他进程执行的影响。尽管可以假设独立运行的进程会非常有效地工作,但实际上有许多情况下可以使用协作性质来提高计算速度、便利性和灵活性。进程可以通过一种称为进程间通信(IPC)的技术相互交互并协调其操作。这些进程之间的相互通信可以被视为一种协作方式。

问题

这个问题基于一个虚构的理发店,店里只有一个理发师,这是一个问题。理发店里有一名理发师,一个理发椅,以及n个座位供顾客等待理发椅,如果有的话。

  • 如果没有顾客,理发师会在自己的椅子上睡着。
  • 当有顾客到来时,他需要唤醒理发师。
  • 当有多个顾客且理发师正在给顾客理发时,如果等候区有空座位,剩余的顾客可以等待;如果等候区没有空座位,他们可以离开。

解决方案

这个问题的解决方案使用三个信号量。第一个信号量用于顾客(不包括理发椅上的顾客,因为他不在等待),计算等候区中顾客的数量。第二个互斥量用于为进程操作提供必要的互斥,而理发师信号量(0或1)用于确定理发师是空闲还是工作。客户记录当前在等候区等待的客户数量,当该数量等于区域中的椅子数量时,下一个客户离开理发店。

理发师在早上到达时执行理发师程序,由于信号量客户最初为0,他会被阻塞。然后理发师回去睡觉,直到第一个客户到来。

代码

分析

当理发师开始工作时,执行理发师程序,他检查是否有任何客户准备好。如果有客户,就选择该客户理发并阻塞客户的信号量。如果没有人要求理发,理发师就会去睡觉。

如果椅子可用,客户释放互斥量,理发师醒来,等待计数器增加。然后理发师进入关键部分,获取互斥量,并开始理发。

理发完成后,客户离开。现在理发师查看等候区是否还有其他客户等待理发。如果没有,理发师就会去睡觉。