流程同步中的 FIFO 理发店
概述 :
在进程同步中,存在一个睡眠理发师问题,正如这里所讨论的。但是在上述方案中,并不能保证顾客按照他们到达理发店的顺序得到服务,即不能保证顾客进入先进先出的方式(先进先出)。在上面讨论的解决方案中。
- 最多可以有n 个顾客到达,然后向顾客发送信号并等待理发师空闲或醒着。
- 一旦理发师空闲或醒来,任何顾客都可以继续。
先决条件——
进程同步中的睡眠理发师问题
问题陈述 :
我们想要一个解决方案,按照顾客到达商店的顺序为他们提供服务。
解决方案 -
为了维护客户的顺序,我们应该实现一个数据结构,称为队列,它遵循先进先出的原则。将使用信号量列表,而不是为客户使用单个信号量。从现在开始,我们将客户称为线程。因此对于线程,将使用信号量列表,命名为队列。这种方法背后的直觉是:
- 当每个线程进入理发店时,它会创建一个线程并将其放入队列中。
- 每个线程不是等待理发师空闲,而是等待自己的信号量。
- 每当理发师空闲或醒来时,他都会从队列中删除线程,并发出信号让其进入椅子。
笔记 -
理发师必须获得互斥量才能访问队列。因此,互斥锁会使用一些信号量来控制线程对队列的访问,理发师会处理队列。
FIFO理发店问题的算法:
Semaphore customer = 0;
Semaphore mutex = 1;
Semaphore barberDone = 0;
Semaphore customerDone = 0;
customer = 0;
Queue queue;
/* Number of chairs available */
n = 4
Customer
{
/* Protects the seat, to mark the present customer */
Semaphore self = 0;
mutex.wait();
if(customer == n){
mutex.signal();
/* Invoke the barber */
customer += 1;
/* Adds the thread inside the queue */
queue.push(self);
mutex.signal();
customer.signal();
self.wait();
/* gets the hair cut */
customerDone.signal();
barberDone.wait();
/* Decrements the number of thread by one */
mutex . wait ();
customers -= 1;
mutex . signal ();
}
Barber{
/* To store the current thread*/
Semaphore curr;
customer.wait();
mutex.wait();
/* Gets the current thread*/
curr = queue.pop();
mutex.signal();
curr.signal();
/* gets the hair cut */
customerDone.waitl();
barberDone.signal();
}
笔记 -
self和curr只不过是指向当前线程的信号量。