Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ EnterCriticalSection不';t锁_C++_Windows - Fatal编程技术网

C++ EnterCriticalSection不';t锁

C++ EnterCriticalSection不';t锁,c++,windows,C++,Windows,这是我代码的一小部分: CRITICAL_SECTION _cs; InitializeCriticalSection(&_cs); void lock() { if (_initizalized){ EnterCriticalSection(&_cs); EnterCriticalSection(&_cs); _locked = true; } } (我写了两次“EnterCriticalSection”,因

这是我代码的一小部分:

CRITICAL_SECTION _cs;
InitializeCriticalSection(&_cs);

 void lock() {
    if (_initizalized){
      EnterCriticalSection(&_cs);
      EnterCriticalSection(&_cs);
      _locked = true;
    }
  }
(我写了两次“EnterCriticalSection”,因为我注意到这行行不通)
据我所知,这一定会造成僵局。但事实并非如此。为什么?

没有相同的线程可以随时进入它。 CRITICAL_部分用于限制多个不同线程之间的访问。

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

在线程拥有关键部分的所有权之后,它可以 对EnterCriticalSection或TryEnterCriticalSection的其他调用 不妨碍它的执行。这可以防止线程丢失 在等待一个关键部分时死锁 已经拥有了。每次线程都会进入临界段 EnterCriticalSection和TryEnterCriticalSection成功。线 必须在每次进入时调用LeaveCriticalSection一次 临界截面

作为

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