7

これを少し明確にしたいだけです。EnterCriticalSectionのWindowsAPIを使用していると想像してください。私はそれらすべてをEnterCriticalSection(&criticalsection);

これはマルチスレッドのスレッド関数です

void thread (){

//enter critical section  (part 1)
data
//leave critical section
///more data 1
//entercritical section  (part 2)
//more data 2
//leave critical section 

}

スレッドがクリティカル(パート1)に入ると、他のスレッドは、より多くのデータ1に実際に共有データがあるかどうかに関係なく、そのセクションに入ることができませんか?また、その間、他のスレッドもクリティカルセクションのパート2に入ることができません。

4

3 に答える 3

10

クリティカルセクションはコードチャンクです。いずれかのスレッドがそのスレッドに入った場合、それが解放されるまで他のスレッドは入ることができません。1と2が異なるクリティカルセクションである場合(つまり、異なるセマフォによって処理される場合)、1が占有されていると、誰かが2を入力できます。

于 2011-04-09T19:06:05.023 に答える
3

EnterCriticalSectionルールは単純です。特定のクリティカルセクション内でコードを実行できるのは1つのスレッドだけです(同じインスタンスへの呼び出しと同じインスタンスでの呼び出しの間で実行されるコードの任意の部分LeaveCriticalSection)。コードの一部などのオペレーティングシステムの観点からは、ここでは関数は関係ありません。重要なのは、前述のルーチンへの呼び出しの数だけです。あるスレッドが特定のクリティカルセクションオブジェクトEnterCriticalSectionよりも何度も呼び出されるという状況が発生するたびLeaveCriticalSectionに、それは「そのクリティカルセクション内」であると言われます。

つまり、複数のクリティカルセクションを作成して、それらを個別に適用することができます。したがって、あるクリティカルセクションが別のクリティカルセクションに影響を与えることはありません。コンストラクターへの個別の呼び出しを使用して、さまざまなクリティカルセクションが作成されます。

于 2011-04-09T19:07:47.273 に答える
3

これを参照してください:

変数を考えてみましょう

int k

このステートメントでは、2つのスレッドがkで動作しています

k+=100;

ここで、kが0に等しいと仮定します。最初のスレッドはkの読み取りを開始し、k = 0を見つけてから、kに100を加算します。次に、2番目のスレッドはkの読み取りを開始してから、最初のスレッドがk=100を書き戻します。次に、2番目のスレッドはk = 0と想定し、100を加算し、最後に2つのスレッドが結合した後にk = 100が予期されない200になります。これがk+=100、クリティカルセクションを設定する理由です。

于 2011-04-09T19:39:02.397 に答える