まず、すべてのスレッドがブロックされているわけではありません。 これらのスレッドはすべてブロックされ、同じクリティカルセクションを入力します。
あなたの質問はスレッドの作業を確認することです。
私の説明は、Windowsクリティカルセクションについて質問したように、Visual Studio IDEを使用することに焦点を当てます。
グローバル変数int loop = 1があります。 while(ループ)中にのみコードを持つクリティカルセクションを持つ。 (無限ループ)
プログラムに少なくとも2つのスレッドがあります。デバッガでコードを実行します。 IDEのスレッドビューを見ると、1つのスレッドがwhile(ループ)でちょうど立ち往生していることがわかります。
スレッドをフリーズして別のスレッドに切り替えるだけです。もう片方のスレッドを実行すると、それ以上動きませんし、クリティカルセクションに入ることができます。
ここで、デバッガのウォッチビューからループの値を0に変更します。 クリティカルセクションを保持している最初のスレッドがフリーズされても何も変わりません。今度はブレークポイントを(ループ)中に置いてフリーズしたスレッドを実行すると、ループの値を0に変更したため、クリティカルセクションを保持していたスレッドがクリティカルセクションを終了します。
他のスレッドはブレークポイントで停止し、クリティカルセクションに入りました。
スコープを拡張するには、クリティカルセクションを使用しない3つのスレッドをプログラムに追加します。
プログラムを実行すると、クリティカルセクションを持つスレッドでのみ有効ですが、クリティカルセクションを使用しない3番目のスレッドは問題なく実行され終了しています。
他のスレッドは、同じCRITICAL_SECTIONを同時に入力することはできません。他のコードの実行を停止したり、他のCRITICAL_SECTIONを入力したりすることはありません。 –
正しく使用されている場合、クリティカルセクションはクリティカルセクションに入ると他のスレッドをブロックします。したがって、クリティカルセクションの入力と終了の間にコードを実行するスレッドは1つだけにすることができます。 OSはブロックされていない別のスレッドに切り替えます。 – Phil1970
17:09 UTCの編集では、キャリアライドのリンクが誤解を招いているか、非常にあまり言い表せません。結果は同じで、私はそれを間違って呼ぶ必要があります。 – user4581301