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
什么是对那些巨大的不同性能比较结果的可能的解释?
s通常从哪里开始?如果s从0开始,则在V() –
@ Me.Name的第二个实现中从不会调用Pulse:s是从0开始的示例:s.P()等待并且s = -1。然后s.V(),所以s变为0并且调用Pulse。我不知道你的意思是什么,这是行不通的。你能说出你的意思吗? – anopows