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

时间:2012-07-02 09:29:35

标签: c# performance locking semaphore monitor

在我的计算机科学课上,我们有几种不同的信号量实现。其中两个是通过使用正常的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变为负值,在Monitor实现中,它在s = 0时保持不变,直到执行V()。

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

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

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

1 个答案:

答案 0 :(得分:0)

我很确定这是因为第一个解决方案中的while与仅使用if的第二个解决方案的原因相同。 while将重复检查条件,导致等待发生,直到发生时间片。

相关问题