0

クリティカル セクションで保護されたコードを含む共有オブジェクトがあり、複数のスレッドが読み取り/書き込みのためにオブジェクトにアクセスしているとします。スレッドがクリティカル セクション内にある場合、他のスレッドは待機しています。スレッドが CS から出ると、OS は待機中のスレッドのいずれかにアクセスを許可します。

1 つのプロセスのみに制限されている場合、CS だけで共有オブジェクトを適切に保護できますか?

CS を保護するためにカーネル オブジェクト (例: ミューテックス、セマフォン) を使用するのが正しい方法であると Web で見たので、質問します。共有リソースを使用したいスレッドは、最初に WaitForSingleObject 型の関数でミューテックス/セマフォを取得する必要があります。ミューテックスが使用されている場合、そのうちの 1 つだけがリソースにアクセスできます。ミューテックスが取得されると、スレッドは CS に入り、本来の処理を実行し、CS を離れてミューテックスを解放します。次に、OS は他の待機中のスレッドがミューテックスを取得できるようにします。

でもそれってCSだけ使ってるのと同じじゃない?

また、ミューテックスを使用すると、CS を単独で使用するよりも大幅に遅くなるはずです。CS のみを使用する場合の唯一の問題は、スレッドが CS 内でクラッシュすると、他のスレッドが共有リソースにアクセスできなくなる可能性があることです。

このアプローチが優れている他の理由はありますか? 前もって感謝します

4

1 に答える 1

2

Windows 固有の用語について、一般的なコンピューター サイエンスの用語と混同して議論しているようです。

コンピュータ サイエンスでは、"クリティカル セクション" という用語は、(通常はデータ共有のために) 排他的に実行する必要があるコードの領域に使用されます。CRITICAL_SECTIONWindows には、実行領域への排他的アクセスを提供するために使用できる と呼ばれる同期オブジェクトがあります。Windows 上のオブジェクトのもう 1 つの属性はCRITICAL_SECTION、単一のプロセス内での使用に制限されていることです。

コンピュータ サイエンスでは、「ミューテックス」という用語は、並列実行スレッドまたは現在実行中のスレッド間で同期を提供するために使用できるオブジェクトを表すためによく使用されます。Windows には、この関数で作成できるミューテックス オブジェクトもありCreateMutex()ます (ミューテックスを表す を返しますHANDLE)。そのオブジェクトは、同じプロセスまたは異なるプロセスのスレッド間でアクセスを同期するために使用できるため、さまざまな方法で と同様にCRITICAL_SECTION(ただし異なる API を使用して) 使用できます。異なるプロセスにある実行スレッドを同期させたい場合は、mutex オブジェクトを使用できますが、CRITICAL_SECTIONオブジェクトは使用できません。

したがって、あなたの質問に答えるために(私は思う)、同じプロセスの一部であるスレッド間のクリティカルセクションを保護することのみに関心がある場合は、CRITICAL_SECTIONオブジェクトで十分です。代わりにミューテックス オブジェクトを使用できますが、パフォーマンスが多少低下する可能性があります。両方のタイプのオブジェクトを使用する必要はないはずです

于 2012-08-16T21:02:59.887 に答える