2012-08-02 132 views
3

这是我的代码的一小部分:EnterCriticalSection的犯规锁定

CRITICAL_SECTION _cs; 
InitializeCriticalSection(&_cs); 

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

(我写“EnterCriticalSection的”两次,因为我注意到,这条线不工作) 据我了解,这必须引起僵局。但事实并非如此。为什么?

回答

9

没有相同的线程可以根据需要经常输入它。 CRITICAL_SECTION用于限制多个不同线程之间的访问。

7

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

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

3

由于MSDN says

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