2016-12-16 3 views
2

私は最近マルチプロセッシングを学んでいますが、私はリソースを使って作業をしているシナリオに遭遇しました。私はそれを再び必要とする前に他の人にそれを使う必要がありますが、再:mutex/semaphoreのロックを解除してすぐにロックします。悪い習慣やそれを行う方法はありますか?

(擬似コード)

while (true) { 
    mutex_lock(resource); 
     /* modify resource */ 
    mutex_unlock(resource); 
     /* wait for someone else to modify resource */ 
} 

問題は、このプロセスは、リソースのロックを解除し、その後すぐにブロックされ、別のプロセスがある場合でも、それを再びロックすることです。 これは、決してCPUをあきらめることがないためです。

私は悪い練習をしていますか?私は、この問題の周りに具体的にコードを設計すること以外は、その周りに道が見えません。 yieldプロセッサをC/C++にする方法はありますか?私は再びロックを取得しないことを保証できますか?

+0

同じロックを待機している複数のスレッドがある場合、1つのスレッドがロックを解除すると、ロックを待機している他のすべてのスレッドはロックされていないスレッドより先になります。だから、この動作はOKです。 server with – bruceg

+1

通常、 'sleep(0)'はこれを行います。オペレーティングシステムが何か良いことを見つけたら、残りの時間量に原則的に放棄します。 –

+0

'pthread' APIを使用していますか? – user3386109

答えて

0

あなたのシグナルが別のスレッドによってトリガーされるまで、ループスレッドをブロックするシグナルを使用します。 このコンセプトを使用すると、CPUサイクルを焼き尽くすことはなく、必要なときにのみ動作します。 C#では、これは構文的に甘やかされたセマフォ(AutoResetEvent)の形を取ることができますが、Cでは少し深くする必要があります。

をご覧ください:https://www.justsoftwaresolutions.co.uk/threading/locks-mutexes-semaphores.html これは、スレッド保護デバイスの各種類の目的を思い出させます。

Good Luck!

+1

信号は重量が重く、むしろ問題があります。条件変数を持つ 'pthread_cond_wait()'のようなより良い方法があります。 –

関連する問題