5

私はスレッド プログラミングが初めてで (現在、会社のプロジェクトで win32 と c++ を使用する必要があります)、クリティカル セクションに入ることはコンテキストの切り替えがないことを意味しますか? スレッドがクリティカルセクションを離れるまでリソースをロックするということですか?

また、私は現在「Win32 でのマルチスレッド アプリケーション」の本を読んでいますが、良さそうですが、初心者が win32 でスレッドを学習するための、より読みやすく最新の本はありますか?

よろしくお願いします^_^

4

1 に答える 1

4

あなたは単なるユーザーモードプロセスであり、OS がコンテキストを別のプロセスに切り替えるのを防ぐことはできません。つまり、最初のスレッドがクリティカル セクションから出るまで、プロセス内の他のスレッドはクリティカル セクションに入ることができません。

MSDNから(強調鉱山):

スレッドは、EnterCriticalSectionまたはTryEnterCriticalSection関数を使用してクリティカル セクションの所有権を要求します。関数を使用してLeaveCriticalSection、クリティカル セクションの所有権を解放します。クリティカル セクション オブジェクトが現在別のスレッドによって所有されている場合、EnterCriticalSection 所有権を無期限に待機します。

また、次のようにEnterCriticalSection述べています。

指定されたクリティカル セクション オブジェクトの所有権を待機します。呼び出し元のスレッドに所有権が付与されると、関数は戻ります。

「これにより、スレッド間のコンテキスト切り替えが妨げられるか」という質問に答えるには。いいえ、そうではありません。ABの2 つのスレッドがあるとします。AがコールEnterCriticalSectionして CS に入る。彼が CS で共有リソースを使用している間、OS は引き続きスレッドBにコンテキストを切り替えることができます。Bは、コールに到達するまで、以前と同じように走り続け、EnterCriticalSectionその時点でブロックします。

このブロッキングが実際にどのように実装されているかは、Windows までです。しかし、ほとんどの場合、「スピン」する代わりに (入力できますか? いいえ、今? いいえ、今? いいえ) OS はそのスレッドを「ブロックされた」キューに置き、スレッドが待機しているものまでスレッドをスケジュールしません ( CS) が利用可能です。その時点で、彼はスケジュールされ、への呼び出しEnterCriticalSectionは成功します。

こちらもご覧ください

于 2013-10-24T06:59:36.760 に答える