3

これは私のコードのごく一部です:

CRITICAL_SECTION _cs;
InitializeCriticalSection(&_cs);

 void lock() {
    if (_initizalized){
      EnterCriticalSection(&_cs);
      EnterCriticalSection(&_cs);
      _locked = true;
    }
  }

(この行が機能しないことに気付いたので、「EnterCriticalSection」を 2 回書きました) 私が理解しているように、これはデッドロックを引き起こすに違いありません。しかし、そうではありません。なぜ?

4

3 に答える 3

9

いいえ、同じスレッドが何度でも入ることはできません。CRITICAL_SECTION は、複数の異なるスレッド間のアクセスを制限するために使用されます。

于 2012-08-02T13:45:25.330 に答える
7

EnterCriticalSectionは、同じスレッドからの再帰呼び出しを許可します。ドキュメントから:

スレッドがクリティカル セクションの所有権を取得すると、実行をブロックすることなく、EnterCriticalSection または TryEnterCriticalSection をさらに呼び出すことができます。これにより、スレッドが既に所有しているクリティカル セクションを待機している間にスレッドがデッドロックするのを防ぐことができます。EnterCriticalSection と TryEnterCriticalSection が成功するたびに、スレッドはクリティカル セクションに入ります。スレッドは、クリティカル セクションに入るたびに LeaveCriticalSection を 1 回呼び出す必要があります。

于 2012-08-02T13:47:16.010 に答える
3

MSDNが言うように、

スレッドがクリティカルセクションの所有権を取得した後、その実行をブロックすることなく、EnterCriticalSectionまたはTryEnterCriticalSectionへの追加の呼び出しを行うことができます。これにより、スレッドがすでに所有しているクリティカルセクションを待機しているときに、スレッドがデッドロックするのを防ぎます。EnterCriticalSectionとTryEnterCriticalSectionが成功するたびに、スレッドはクリティカルセクションに入ります。スレッドは、クリティカルセクションに入るたびにLeaveCriticalSectionを1回呼び出す必要があります。

于 2012-08-02T13:47:59.277 に答える