2011-06-19 11 views
2

スレッドが条件変数で待機するスレッドが複数ある場合、pthread_cond_signalで目を覚ます順序は?私はpthread_cond_signalが必ずしも睡眠の順番で起きるとは限りません。これは飢えを引き起こすかもしれない...そうじゃない?pthread_cond_signalとスレッドの枯渇の可能性

おかげ

答えて

4

それは公正であるために仮定されたスケジューリングポリシーによって決定されます。

スレッドがスケジューリングによって枯渇していない場合、スレッドはスケジューリングされていてはなりません。 specから

複数のスレッドが条件変数でブロックされている場合は、スケジューリングポリシーは、スレッドのブロックが解除される順序を決定します。

+0

ありがとう...どのように私は使用されるスケジューリングポリシーを見つけるのですか?デフォルトでは、最も優先順位の高いスレッドは起動されますが、すべてのスレッドが同じであるかどうかは不明です。 –

+0

@Juggler - これはOSカーネルの一部です。通常、スケジューリングアルゴリズムは、あなたが今説明したように単純ではなく、公平性を保証する手段を含んでいます。自分でスケジューリングアルゴリズムを書いていない限り、スケジューリングの基本要件は公正であると思います。 – littleadv

1

公正さは保証されていないため、常に飢餓状態になる可能性があります。 絶対的な公平性を確保するためには、到着順を追跡するためにキューを使用して独自のメカニズムを実装する必要があります。

0

この疑問は、条件変数の乱用を示唆しています。条件変数の使用は、状態が発生したことをスレッドに警告することです。スレッドを1つだけウェイクさせるときは、のいずれかのスレッドが条件を処理できるためである必要があります。どのスレッドが復帰したかに気を付けると、どのスレッドもその状態を処理できるわけではありません。

ほとんどの実装では、おそらくあなたが望むものが得られますが、何をしようとしているのかは、おそらくもっと良い方法でしょう。

関連する問題