2012-07-02 38 views
0

在我的计算机科学课,我们有几个不同的信号量实现。信号量实现:监控与睡眠理发,巨大的性能差异

监督执行:

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); 
     } 
} 

} 

睡觉理发Implentation:其中两个是由使用普通显示器的实现和一个使用睡眠理发实施完成

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实现中变为负数,直到执行V()时,它停留在s = 0。

但测量有一个巨大的差异(数据来自演示幻灯片):

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

什么是对那些巨大的不同性能比较结果的可能的解释?

+0

s通常从哪里开始?如果s从0开始,则在V() –

+0

@ Me.Name的第二个实现中从不会调用Pulse:s是从0开始的示例:s.P()等待并且s = -1。然后s.V(),所以s变为0并且调用Pulse。我不知道你的意思是什么,这是行不通的。你能说出你的意思吗? – anopows

回答

0

我很确定这是由于第一个解决方案中的while,而第二个解决方案仅使用ifwhile将重复检查条件,导致等待发生,直到发生时间片。