0

私のコンピュータサイエンスのクラスでは、セマフォのいくつかの異なる実装がありました。それらのうちの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

それらの大きく異なるパフォーマンスの結果について考えられる説明は何ですか?

4

1 に答える 1

0

この理由はwhile、最初のソリューションの が原因であると確信していifます。はwhile条件を繰り返しチェックするため、タイム スライスが発生するまで待機が発生します。

于 2014-12-02T03:06:53.560 に答える