信号量实现:监视器与睡眠理发师,巨大的性能差异



在我的计算机科学课上,我们有几种不同的信号量实现。其中两个是使用普通监视器实现完成的,另一个是使用睡眠理发师实现完成的:

监控实施:

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 在睡眠理发器实现中变为负数,而在监视器实现中它保持在 s=0,直到执行 V()。

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

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

对于这些巨大的不同表现结果,可能有什么解释?

我很

确定造成这种情况的原因是由于第一个解决方案中的while,而不是第二个解决方案仅使用ifwhile将反复检查条件,导致等待发生,直到出现时间片。

最新更新