私のコンピュータサイエンスのクラスでは、セマフォのいくつかの異なる実装がありました。それらのうちの2つは、通常のMonitor実装を使用して実行され、1つはSleepingBarber実装を使用して実行されました。
モニターの実装:
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が負になり、モニターの実装ではV()が実行されるまでs=0のままになることです。
しかし、測定すると大きな違いがありました(プレゼンテーションスライドのデータ):
Semaphore Type Time (ms)
Monitor 7549
Monitor (Barber) 109598
それらの大きく異なるパフォーマンスの結果について考えられる説明は何ですか?