EnterCriticalSection不会锁定

时间:2012-08-02 13:44:07

标签: c++ windows

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

CRITICAL_SECTION _cs;
InitializeCriticalSection(&_cs);

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

(我写了两次“EnterCriticalSection”,因为我注意到这行不起作用) 据我了解,这必然会造成僵局。但事实并非如此。为什么呢?

3 个答案:

答案 0 :(得分:9)

没有相同的线程可以随意输入它。 CRITICAL_SECTION用于限制多个不同线程之间的访问。

答案 1 :(得分:7)

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

  

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

答案 2 :(得分:3)

作为MSDN says

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