Multithreading 信号灯小册子

Multithreading 信号灯小册子,multithreading,semaphore,thread-synchronization,Multithreading,Semaphore,Thread Synchronization,下面是代码,其中每个线程必须等待其他线程完成集合部分,然后等待每个线程完成关键部分 /* rendezvous code */ mutex.wait() count++; mutex_signal() if(count==n) sem.signal() sem.wait() sem.signal() mutex.wait() count--; mutex.signal() if(count==0) sem.wait() 我知道两

下面是代码,其中每个线程必须等待其他线程完成集合部分,然后等待每个线程完成关键部分

/* rendezvous code */
mutex.wait()
count++;
mutex_signal()
if(count==n)
            sem.signal()
sem.wait()
sem.signal()

mutex.wait()
          count--;
mutex.signal()

if(count==0)
         sem.wait()
我知道两个进程可以达到这样的情况,即两个进程都看到相同的count值(可能是0或n)。因此,可以同时发送两个或多个信号。上一次测试怎么会出现死锁。我似乎不明白这一点。
这是一种旋转式的信号灯布局,作者实际上认为它是一个旋转门,但它是一个信号灯,应该在没有死锁的情况下工作。
请告诉我这段代码是如何死锁的

我会尽力解释我的看法

除最后一个线程外,所有线程都将在第一个sem.wait()处等待。一旦最后一个线程到达,它将sem.signal()(因为count==n)允许一个等待的线程(比如T1)继续。然后T1将依次执行sem.signal(),这将允许另一个线程继续。这有点像连锁反应。请注意,要传递的最后一个线程还将发出一个信号,使信号量值为1。 现在,如果两个线程出现并看到count==0,那么将尝试执行sem.wait()。但由于信号量值为1,一个线程将无法通过,从而导致死锁。

如果“if”语句也应该位于“mutex”信号量指定的关键部分内,否则争用条件可能导致死锁

也就是说,正确的代码是

/* rendezvous code */
mutex.wait()
count++;
if(count==n)
        sem.signal()
mutex.signal()

sem.wait()
sem.signal()

mutex.wait()
      count--;
if(count==0)
     sem.wait()
mutex.signal()

但是,即使一个线程到达count==0的点,它也会等待,因此所有进程都会在这一点等待。两个线程到达或一个线程到达,这些线程将无法通过。您确定吗?因为正如我所提到的“最后一个要传递的线程也会发出一个信号,使信号量值为1”。因此,如果一个线程到达count==0,它将能够执行sem.wait()并传递该点。