0

在我的计算机科学课上,我们有几种不同的信号量实现。其中两个是通过使用普通的 Monitor 实现完成的,一个是使用 Sleeping Barber 实现的:

监控实施:

class Semaphore {
int s; object mutex = new object();
public Semaphore(int n) { s = n; }

public void P() 
{
        lock (mutex) 
        {
          while (s == 0) Monitor.Wait(mutex); 
          s--; 
        }
}
public void V() 
{
        lock (mutex) 
        {
          s++; Monitor.Pulse(mutex); 
        }
}

}

睡觉理发师实施:

class Semaphore {
int s; object mutex = new object();
public Semaphore (int n) { s = n; }

public void P () 
{
        lock(mutex) 
        {
            s--; 
            if (s < 0) Monitor.Wait(mutex);
        }
}
public void V () 
{
        lock(mutex) 
        { 
            s++;
            if (s <= 0) Monitor.Pulse(mutex);
        }
}

}

这两种实现似乎与我非常相似。我看到的唯一区别是 s 在 sleep barber 实现中变为负数,而在 Monitor 实现中它保持在 s=0 直到 V() 被执行。

但测量结果存在巨大差异(来自演示幻灯片的数据):

Semaphore Type     Time (ms)
Monitor                 7549
Monitor (Barber)      109598

对这些巨大不同的绩效结果有什么可能的解释?

4

1 回答 1

0

我很确定这是由于while第一个解决方案中的原因,而第二个解决方案仅使用if. 会while反复检查条件,导致等待,直到一个时间片出现。

于 2014-12-02T03:06:53.560 回答