3

今日私はMSDNでこれに出くわしました:

他のスレッドが続行する準備ができていることを通知するために使用するスレッドごとに1つ。コンシューマースレッドは、プロデューサーがイベントを通知するのを待ってからクリティカルセクションに入り、プロデューサースレッドは、コンシューマースレッドがイベントを通知するのを待ってからクリティカルセクションに入る。各スレッドがクリティカルセクションを離れた後、他のスレッドを解放するようにイベントに通知します。」

最初はWTFと思いました!-私は常に、スレッドがクリティカルセクションを取得しようとした順序で取得することを想定していました。これはServicePackの動作に奇妙な大きな変化があるように見えますが、ServicePackはWindowsのServerEdition用であり、Vistaは当時開発中でした。

とにかく、それは少し意味があります-このように、スケジューラーが回転する次の待機中のスレッドは、少なくとも次のクリティカルセクションを取得するスレッドになると思います。したがって、彼らが楽しみのためにランダムな選択をすることに決めない限り、それが理にかなっている唯一のことです;)。

それでも、これは私が行った仮定であり、現在、FIFO依存のケースが問題にならないことを確認するためにコードを評価しています。

誰かがこれに関して現実の問題を抱えていましたか?クリティカルセクションを取得するスレッドの順序はFIFOであることが保証されていませんが、通常はFIFOではありませんか?通常はFIFO(またはFIFOに近い)ではない場合、スレッドが激しく争われているクリティカルセクションを待機できる時間を知っている人はいますか?優先度の低いスレッドの場合、クリティカルセクションを取得しようとする優先度の高いスレッドが常に存在する場合(FIFOが順守されていれば、優先度の低いスレッドがずっと前に並んでいたとしても)、ほぼ無期限に待機し続ける可能性があります。 )?このシナリオを防ぐための安全上の問題はありますか、それともセカンダリ同期オブジェクトへの依存が義務付けられていますか?

もちろん、これは本当に激しく争われているクリティカルセクションでのみ重要です。

わからない、多分私はそれをやりすぎているのかもしれない...しかし何かがこれについて私を悩ませている。任意の洞察をいただければ幸いです。ありがとう ;)

4

2 に答える 2

1

初めて聞いたのですが、考えてみると問題ないようです。

正しく理解できたら::

OldWay:

Thread A acquired the CritSec
Thread B waiting for the CritSec , tried to acquire it at time t
Thread C waiting for the CritSec , tried to acquire it at time t + dt

When Thread A releases the CritSec, OS ensures that Thread B acquires it.

新しい方法 :

Thread A acquired the CritSec
Thread B waiting for the CritSec , tried to acquire it at time t
Thread C waiting for the CritSec , tried to acquire it at time t + dt

When Thread A releases the CritSec, OS may choose any Thread to acquire it. So, it may be Thread B or C that will acquire it after A releases it.

私は、CritSecを待っているスレッドが、CritSecを取得したい順序で取得することを想定していませんでした(そして、他の誰も想定していなかったと思います)。

たぶん、これは、この仮定を行う一部のプロファイラー/デバッガーまたは一部のパフォーマンス監視メカニズムの問題として発生します...

于 2011-12-02T07:25:10.283 に答える
1

私の経験では、クリティカルセクションはFIFOではありませんでした(おそらく、ドキュメントチームは2003年に新しいと言って彼らのワイヤーを交差させました)。そして、はい、それは私たちがたくさん見たスレッドの飢餓につながる可能性があります。FIFOが必要な場合は、ミューテックスが必要です。

ミューテックスはカーネルオブジェクトであるため、ミューテックスを取得するには、リング3の楽観的クリティカルセクションよりもコストがかかります。しかし、FIFOは、必ずしも必要ではないとして手に負えないものとして却下できる(またはすべきである)ものの1つではなく、スレッドの「階層」とは何の関係もありません(それが何であれ、それは優先順位を意味しますか?) 。同じ優先度の1000スレッドが単一のロックにヒットすると、簡単に枯渇が発生します。

于 2017-04-07T01:02:01.070 に答える