2013-04-09 10 views
6

C++ 11にスレッドが飢餓状態になるのを防ぐロックポリシーがあるかどうかは不思議です。C++ 11でスレッドの飢餓を防ぐ方法

私は1つのミューテックスのために競合しているスレッドの束を持っています。今、私の問題は、クリティカルセクションを離れるスレッドがすぐに同じミューテックスで競合し、ほとんどの時間が勝つということです。したがって、mutexで待機している他のスレッドは飢えています。

重要なセクションを残してスレッドを最小限の時間スリープさせて、他のスレッドにミューテックスをロックする機会を与えたいとは思わない。

ミューテックスで待機しているスレッドに対して公正なロックを可能にするパラメータが必要であると思っていましたが、適切な解決策を見つけることができませんでした。

スレッドの実行順序を再スケジュールすると思われるstd :: this_thread :: yield()関数が見つかりましたが、スケジューラスレッドのヒントのみであり、スレッドを再スケジュールするかどうかはスケジューラスレッドの実装に依存します。

C++ 11の同じミューテックスで待機しているスレッドに適切なロックポリシーを与える方法はありますか? 通常の戦略は何ですか?

おかげ

+0

http://stackoverflow.com/questions/11666610/how-to-give-priority-to-privileged-thread-in-mutex-locking リンク!! –

+0

これはスレッドの飢餓の問題ではなく、人々がそれを見て助けてくれるようにするコードを投稿することができます。 – dirvine

+0

一般的に、1つのミューテックスのために競合する多数のスレッドを持っているべきではありません。コードが1つのスレッドだけが一度に作業できるシリアルの場合は、正当な理由はありますが、すべて同じ正当な理由ではなく、異なる回答をすることもできます。 – Yakk

答えて

6

これは、同じスレッドが再びmutexを取ることができたときにタスクを切り替え無駄に時間を回避するように設計されたミューテックスでは一般的な最適化です。現在のスレッドにタイムスライスがまだ残っている場合は、スレッドを一時停止するのではなくミューテックスを使用させ、別のスレッドに切り替えることで、1秒あたりに実行されるユーザー命令のスループットが向上します(キャッシュラインの大規模な再ロードおよびその他の様々な遅延)。

ミューテックスに多量の競合があると、これが問題になる場合は、アプリケーションの設計が間違っています。これらのスレッドはすべてmutexでブロックされているため、何もしません。多分スレッドがなくても良いでしょう。

複数のスレッドがミューテックスを競合する場合、どのスレッドがロックを取得するかは関係ありません。直接の競合も珍しいことです。特に、多くのスレッドを持つ直接の競合。

私はこれがOKのシナリオだと思う唯一の状況は、すべてのスレッドが条件変数を待っているところです。すべてのスレッドは、ミューテックスのために争うでしょうが、もしこれを正しく実行しているならば、これは偽の覚醒ではないことをすばやく確認してから、ミューテックスをリリースしてください。それでも、これは "雷の群れ"と呼ばれ、理想的ではありません。これらのスレッドをすべてシリアル化するからです。あなたを助けるかもしれない。ここ

関連する問題