2011-01-20 9 views
4

プロセッサ使用率に関して次のコードに違いはありますか?C:スレッドsemaphore_waitとwhileループのスレーブ

それが実行するスレッドを必要とするとき工assが定期的に semaphore_signal(sem);を呼び出し

OR

void *ManageSequencer(void *argument){ 
    SomeClass *someClass = (SomeClass *)argument; 

    while (someClass->ThreadIsAlive()) { 

    semaphore_wait(sem); 

    //thread execution statements 

    } 
    return argument; 
} 

を実行するスレッドを必要とするとき、いくつかのクラスが定期的にisAsleep=falseを設定

void *ManageSequencer(void *argument){ 
    SomeClass *someClass = (SomeClass *)argument; 

    while (someClass->ThreadIsAlive()) { 

    while(someClass->isAsleep) { } 

    someClass->isAsleep = true; 

    //thread execution statements 

    } 
    return argument; 
} 

この質問は、アトミック性についてではなく、単にwhileループがセマフォーソリューションよりも多くのプロセッサーを引き起こすかどうかについてです。セマフォーは、条件が満たされるまでブロックするwhileループを内部に持っていますか(セマフォーが0より大きい場合)?

答えて

3

はい、最初のプロセッサでは2番目のプロセッサよりもはるかに多くの処理が行われます。基本的に、最初の例のアクティブなスレッドがスケジュールされるたびに、スケジューラがそれをプリエンプトして別のスレッド時間を与えるまで、その状態で回転しているすべてのプロセッサ時間を消費します。つまり、コンテキストスイッチがあり、そのスレッドの(潜在的に)タイムスライス全体が毎回100%使用され、実際には機能しません。

2番目の例では、カーネル内のスレッドをトラップするので、カーネルがシグナルを取得してスレッドを再開するまでプロセッサ時間をまったく取得しません。そのようなことが起こると、スケジューラは処理時間をもう一度与えますが、現在は、CPU全体をタイムスライスで分割するのではなく、実際に行う作業があります。

2

典型的なセマフォの実装では、プロセッサ時間を使用しないようにスレッドをカーネルに「パーク」します。強くその理由:)

おすすめ(同様に、ほとんどのミューテックスの実装はこれを実行しますが、スピンロックはしません)someClass->isAsleepがfalseの場合

2

はあなたの最初の例では、外側のループで忙しいスピンに起こっています。すなわち、何もしないときに与えられたすべてのプロセッサ時間を費やす。

2番目の例は、セマフォでスリープ状態になり、CPU時間を費やさなくなります。 I.最初のケースは非常に、非常に悪いです、2番目のケースは良いです。