📜  流程同步中的 FIFO 理发店

📅  最后修改于: 2022-05-13 01:56:11.610000             🧑  作者: Mango

流程同步中的 FIFO 理发店

概述 :
在进程同步中,存在一个睡眠理发师问题,正如这里所讨论的。但是在上述方案中,并不能保证顾客按照他们到达理发店的顺序得到服务,即不能保证顾客进入先进先出的方式(先进先出)。在上面讨论的解决方案中。

  • 最多可以有n 个顾客到达,然后向顾客发送信号并等待理发师空闲或醒着。
  • 一旦理发师空闲或醒来,任何顾客都可以继续。

先决条件——
进程同步中的睡眠理发师问题

问题陈述 :
我们想要一个解决方案,按照顾客到达商店的顺序为他们提供服务。

解决方案 -
为了维护客户的顺序,我们应该实现一个数据结构,称为队列,它遵循先进先出的原则。将使用信号量列表,而不是为客户使用单个信号量。从现在开始,我们将客户称为线程。因此对于线程,将使用信号量列表,命名为队列。这种方法背后的直觉是:

  1. 当每个线程进入理发店时,它会创建一个线程并将其放入队列中。
  2. 每个线程不是等待理发师空闲,而是等待自己的信号量。
  3. 每当理发师空闲或醒来时,他都会从队列中删除线程,并发出信号让其进入椅子。

笔记 -
理发师必须获得互斥量才能访问队列。因此,互斥锁会使用一些信号量来控制线程对队列的访问,理发师会处理队列。

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();

}

笔记 -
selfcurr只不过是指向当前线程的信号量。