1

これがシナリオです。値を読み取る複数のプロセッサ スレッドがあります。値に書き込むことができるスレッドは 1 つだけです。設定上、当然、書き込み中は誰も読み取ることができません。そのため、CCriticalSection は、1 人が新しい値を書き込んでいるときに、すべてのワーカー スレッドをロックアウトします。ただし、これを行うと、誰かがそれを見ようとするたびにすべてのワーカー スレッドが停止します (相互にロックアウトされます)。値を読み取るためにすべてのワーカーが停止して列に並ぶ必要があるため、処理にボトルネックが生じます。CCriticalSection以外に、すべての小さなワーカーが読み取りを続行できるようにする方法はありますか(これは問題ありません。スレッドの問題はありません)、メインスレッドが書き込みたいときにのみ停止しますか?

ワーカーに停止するように指示するブール値を設定し、次に Sleep() を 1 秒ほど (完了させるために) 更新し、ブール値をリセットすることを検討しました。それはちょうど..まあ..ヘビーハンドのようです。

4

3 に答える 3

0

InterlockedXXXXX 関数も使用できます-ロックを完全に回避します-たとえば、この記事を参照してください

于 2012-05-30T17:52:54.870 に答える
0

リーダー/ライター ロックを使用できます 。http ://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock

于 2012-05-30T17:34:26.147 に答える
0

あなたが説明するシリアライゼーションは、現在の設計では避けられません。

「しかし、そうすると、誰かがそれを見ようとするたびに、すべてのワーカー スレッドが停止します (相互にロックアウトされます)。ボトルネックが生じます。」

コードを再設計して、書き込みが終了するのを待っている間、アルゴリズムに関連するサブタスクを完了するためにプログラムによって他のスレッドが使用されるようにします。

このアプローチはワーク スティーリングと呼ばれ、キューの並べ替えに関連して他のスタック オーバーフローの投稿で説明されています。

于 2012-05-30T17:34:57.890 に答える