2

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

/* 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()

我知道两个进程可以达到相同的计数值(0 或 n 可能)的情况。因此,可以同时发送两个或多个信号。上次测试怎么会出现死锁。我似乎不明白这一点。
这是一种旋转门信号量安排,作者实际上认为它是一个旋转门,但它是一个信号量,它应该在没有死锁的情况下工作。请告诉我这段代码怎么会出现死锁!

4

2 回答 2

1

我将尝试解释我的看法。

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

于 2011-02-16T09:51:57.637 回答
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()
于 2015-10-19T12:57:00.700 回答