2016-05-25 9 views
-4

本当にそうであるかどうかをチェックしたいのですが、特定のスレッドがクリティカルセクション内にある場合、クリティカルセクション以外のスレッドは実行できません。WindowsのCRITICAL_SECTIONは他のスレッドが実行されないようにします

ミューテックスがクリティカルセクションよりも優れていると考える人がいるため、これはクリティカルセクションを使用していない他のスレッドをブロックする可能性があるためです。

このURLをご覧ください:http://www.careerride.com/VC++-critical-section-mutex-and-semaphore.aspxこれは本当ですか?

+0

他のスレッドは、同じCRITICAL_SECTIONを同時に入力することはできません。他のコードの実行を停止したり、他のCRITICAL_SECTIONを入力したりすることはありません。 –

+0

正しく使用されている場合、クリティカルセクションはクリティカルセクションに入ると他のスレッドをブロックします。したがって、クリティカルセクションの入力と終了の間にコードを実行するスレッドは1つだけにすることができます。 OSはブロックされていない別のスレッドに切り替えます。 – Phil1970

+0

17:09 UTCの編集では、キャリアライドのリンクが誤解を招いているか、非常にあまり言い表せません。結果は同じで、私はそれを間違って呼ぶ必要があります。 – user4581301

答えて

2

まず、すべてのスレッドがブロックされているわけではありません。 これらのスレッドはすべてブロックされ、同じクリティカルセクションを入力します。

あなたの質問はスレッドの作業を確認することです。

私の説明は、Windowsクリティカルセクションについて質問したように、Visual Studio IDEを使用することに焦点を当てます。

グローバル変数int loop = 1があります。 while(ループ)中にのみコードを持つクリティカルセクションを持つ。 (無限ループ)

プログラムに少なくとも2つのスレッドがあります。デバッガでコードを実行します。 IDEのスレッドビューを見ると、1つのスレッドがwhile(ループ)でちょうど立ち往生していることがわかります。

スレッドをフリーズして別のスレッドに切り替えるだけです。もう片方のスレッドを実行すると、それ以上動きませんし、クリティカルセクションに入ることができます。

ここで、デバッガのウォッチビューからループの値を0に変更します。 クリティカルセクションを保持している最初のスレッドがフリーズされても何も変わりません。今度はブレークポイントを(ループ)中に置いてフリーズしたスレッドを実行すると、ループの値を0に変更したため、クリティカルセクションを保持していたスレッドがクリティカルセクションを終了します。

他のスレッドはブレークポイントで停止し、クリティカルセクションに入りました。

スコープを拡張するには、クリティカルセクションを使用しない3つのスレッドをプログラムに追加します。

プログラムを実行すると、クリティカルセクションを持つスレッドでのみ有効ですが、クリティカルセクションを使用しない3番目のスレッドは問題なく実行され終了しています。

0

一般的には、他のスレッドは、同じCRITICAL_SECTIONで保護された領域に入ることを試みない限り、影響を受けません。これらのスレッドは、どのように入力しようとしたかによって、クリティカルセクションが使用可能になるまでブロックされます。

最初にクリティカルセクションに入るのは問題ありませんが、スレッドが入るとクリティカルセクションが残されるまで他のスレッドは入りません。

「B」が最初に入力が許可されているかどうかをテストしない限り、たとえば「TryEnterCriticalSection」と入力すると、「A」がクリティカルセクションを終了するまで、「A」がクリティカルセクションを終了するまでブロックされます。待つよりもむしろ何かをすることを選ぶ。

I recommend giving this a read.

C++ 11以上、最近の標準は、あなたの移植性を向上させるために<thread> library's相互排他施設を使用して、オプションであれば、私はまた、お勧めします。

2

私はそれを簡単にしようとしましょう。

道路上を走行しているときに、赤信号が表示されます。他の人が交差点を使用するまで停止する必要があります。あなたの待ち時間は、都市、国、または世界全体の他の道路とつながっていません。

ロンドンの信号が緑色または赤色で、サンフランシスコの特定の信号を待っている場合、ロンドンの信号が緑色に変わった場合(実際に通過することは許されません)、実際には関係ありません。ロンドンの信号が赤でも、あなたが信号を通過しないようにすることもできません。

同様に、そのような信号はいずれも、高速道路上の車両を防ぐことはできません。他の車両はあなたが待っている信号でブロックされていません(OSの見通しでは自由スレッドです)。

特定の信号のすべての車両のセットがスレッドであると仮定します。次に、4つの交差信号では、信号が緑色になるのを待っている3つのスレッドが存在します。 1つのスレッド(車両のセット)だけがさらに進むことができ(道路を利用する)、他の3つ(またはそれ以上)のスレッドはすべて待機する必要があります。

これはCSとmutexのためのものです。 EnterCriticalSectionまたはWaitForSingleObjectでブロックされている場合、シグナルライトが緑色になるのを待っています(待機中のスレッド)。

関連する問題