输入关键部分不锁定

EnterCriticalSection doesn't lock

本文关键字:锁定 键部 输入      更新时间:2023-10-16

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

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

(我写了两次"EnterCriticalSection",因为我注意到这一行不起作用)据我所知,这一定会造成僵局。但事实并非如此。为什么?

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

EnterCriticalSection允许从同一线程进行递归调用。来自文件:

在线程拥有关键部分的所有权后,它可以对EnterCriticalSection或TryEnterCriticalSection的其他调用而不阻止其执行。这样可以防止线程在等待它的关键部分时死锁已经拥有。线程每次都进入关键部分EnterCriticalSection和TryEnterCriticalSection成功。一根线每次进入时都必须调用LeaveCriticalSection一次关键部分。

正如MSDN所说,

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