3

这是我的代码的一小部分:

CRITICAL_SECTION _cs;
InitializeCriticalSection(&_cs);

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

(我写了两次“EnterCriticalSection”,因为我注意到这条线不起作用)据我所知,这一定会导致死锁。但事实并非如此。为什么?

4

3 回答 3

9

没有相同的线程可以随心所欲地进入它。CRITICAL_SECTION 用于限制多个不同线程之间的访问。

于 2012-08-02T13:45:25.330 回答
7

EnterCriticalSection允许来自同一线程的递归调用。从文档中:

在线程拥有临界区的所有权后,它可以对 EnterCriticalSection 或 TryEnterCriticalSection 进行额外调用,而不会阻止其执行。这可以防止线程在等待它已经拥有的临界区时自行死锁。每次 EnterCriticalSection 和 TryEnterCriticalSection 成功时线程进入临界区。线程每次进入临界区时都必须调用一次 LeaveCriticalSection。

于 2012-08-02T13:47:16.010 回答
3

正如MSDN 所说

在线程拥有临界区所有权后,它可以对 EnterCriticalSection 或 TryEnterCriticalSection 进行额外调用,而不会阻塞其执行。这可以防止线程在等待它已经拥有的临界区时自行死锁。每次 EnterCriticalSection 和 TryEnterCriticalSection 成功时线程进入临界区。线程每次进入临界区时都必须调用一次 LeaveCriticalSection。

于 2012-08-02T13:47:59.277 回答