質問

現在の私の理解状態変数はすべてのブロック(待ち時間なし)スレッド挿入の基本的なFIFOキューの最初の項目が覚めた時の信号()が呼び出されます。

必要があります。をいつでも変更することがキュー(作り出す新しい構造)とともに、優先度キューょうか?しようと考えていますが、最も解決していま末までによって阻まれている既存のキューの構造固有のC.V.は、ミューテックス.

よろしく!

役に立ちましたか?

解決

私はあなたが何をしようとして再考すべきだと思います。あなたのパフォーマンスを最適化しようとしている場合は、おそらく間違ってツリーを吠えています。

pthread_cond_signal() のであっても、正確に1つのスレッドのブロックを解除することは保証されません - それは、の少なくともの1つのスレッドのブロックを解除することが保証されていますので、あなたのコードはよりよい複数のスレッドが同時にブロックされていない状況を処理することができます。これを行うための典型的な方法は、再び待機中に戻りfalseの場合、各スレッドは、ブロック解除になった後の状態を再確認し、そしてするためのものです。

あなたが待っているスレッドの独自のプライオリティキューを保持スキームのいくつかの並べ替えを実装することができ、各スレッドは、それが待機を開始した直前にそのキューに自分自身を追加し、ブロックを解除するとき、それはキューをチェックしますが、これは希望複雑さの多くと深刻な問題(競合条件、デッドロックなど)のために多くの可能性を追加します。また、オーバーヘッドの非自明な量を追加しました。

優先度の高いスレッドが条件変数が通知されていることを同じ瞬間に条件変数を待って起動する場合は、

また、何が起こりますか?誰がブロックされていない、新たに到着した優先度の高いスレッドまたは以前の最も優先度の高いスレッドを取得する?

のスレッドがブロックされていないに取得する順序は、カーネルのスレッドスケジューラに完全に依存しているので、あなたはその慈悲です。私もどちらか、FIFOの順序を想定していないでしょう。

他のヒント

条件変数は、基本的には障壁であり、あなたは、待機中のスレッドのキューを制御することはできませんので、

優先順位を適用する本当の方法はありません。これは、待機中のスレッドはFIFO方式で行動すると仮定し、無効です。

アトミック、追加の条件変数の組み合わせで、あなたはそれを合図スレッドが優先CV上で再度ブロックをマスターCVを再合図とするソリューションを構築することができ関与スレッド/優先順位の事前知識確かに、一般的な解決策ではないでしょう。それはまた、他のいくつかの欠陥がある可能性がありますので、私の頭の上からもです。

でのスケジューラーを判定するスレッドます。楽しみがさらに広がるでしょう pthread_setschedparampthread_getschedparam と怒の方針SCHED_OTHER, SCHED_FIFO, や SCHED_RR の優先順位をもつ。なんかすことが思います。

で音がしたい何かの予測に本質的に非決定的な.としてAndrewがhackものが私の推測ではこのへヴたくコードまで嫌いな自分で書き込み、半年間です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top