进入临界区并不会锁定。

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

这是我的一小部分代码:

CRITICAL_SECTION _cs;
InitializeCriticalSection(&_cs);

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

我写了两次"EnterCriticalSection",因为我注意到这一行不起作用。据我理解,这应该会导致死锁,但实际上并没有。为什么呢?

3个回答

9

同一个线程可以随意进入它,但不同的线程之间需要使用CRITICAL_SECTION来限制访问。


7

EnterCriticalSection 允许同一线程进行递归调用。来自文档的说明:

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


3
根据MSDN的说法,当一个线程拥有临界区时,它可以多次调用EnterCriticalSection或TryEnterCriticalSection而不会阻止其执行。这样可以防止线程在等待已经拥有的临界区时出现死锁。每次成功进入临界区后,线程都会进入临界区。每次进入临界区后,线程必须调用LeaveCriticalSection。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接