あなたは単なるユーザーモードプロセスであり、OS がコンテキストを別のプロセスに切り替えるのを防ぐことはできません。つまり、最初のスレッドがクリティカル セクションから出るまで、プロセス内の他のスレッドはクリティカル セクションに入ることができません。
MSDNから(強調鉱山):
スレッドは、EnterCriticalSection
またはTryEnterCriticalSection
関数を使用してクリティカル セクションの所有権を要求します。関数を使用してLeaveCriticalSection
、クリティカル セクションの所有権を解放します。クリティカル セクション オブジェクトが現在別のスレッドによって所有されている場合、EnterCriticalSection
所有権を無期限に待機します。
また、次のようにEnterCriticalSection
述べています。
指定されたクリティカル セクション オブジェクトの所有権を待機します。呼び出し元のスレッドに所有権が付与されると、関数は戻ります。
「これにより、スレッド間のコンテキスト切り替えが妨げられるか」という質問に答えるには。いいえ、そうではありません。AとBの2 つのスレッドがあるとします。AがコールEnterCriticalSection
して CS に入る。彼が CS で共有リソースを使用している間、OS は引き続きスレッドBにコンテキストを切り替えることができます。Bは、コールに到達するまで、以前と同じように走り続け、EnterCriticalSection
その時点でブロックします。
このブロッキングが実際にどのように実装されているかは、Windows までです。しかし、ほとんどの場合、「スピン」する代わりに (入力できますか? いいえ、今? いいえ、今? いいえ) OS はそのスレッドを「ブロックされた」キューに置き、スレッドが待機しているものまでスレッドをスケジュールしません ( CS) が利用可能です。その時点で、彼はスケジュールされ、への呼び出しEnterCriticalSection
は成功します。
こちらもご覧ください