2011-11-03 65 views
1

为什么此代码会导致死锁?Win32中的CRITICAL_SECTION/CONDITION_VARIABLE死锁

THREAD 1:

EnterCriticalSection(&lock_); 

... Create thread 1 

EnterCriticalSection(&lock_); 
while (pred) { 
    SleepConditionVariableCs(&cond_, &lock_); 
    // At this point, I would expect thread #2 to wake up, but it doesn't. 
} 
LeaveCriticalSection(&lock_); 
LeaveCriticalSEction(&lock_); 

THREAD 2:

EnterCriticalSection(&lock_); 

// This never runs 
... Do something else for a while 

LeaveCriticalSection(&lock_); 

根据Win32 API的,EnterCriticalSection的可以从相同的线程的行被调用两次而不死锁。看来SleepConditionVariableCS只能解锁临界区一次,这意味着线程#2永远不会运行。我的推理在这里是否正确?

基本上,我想要的就是像Java的ReentrantLock。 ReentrantLock和CRITICAL_SECTION有什么区别?

+4

正确。 'SleepConditionVariableCs'只能退出关键部分一次。 “EnterCriticalSection”可以在同一个线程中连续调用两次而不会发生死锁,这也是正确的。但是,如果您打算调用'SleepConditionVariableCs',则必须全部退出临界区域(即在您调用'SleepConditionVariableCs'时,输入计数必须恰好为1)。在上面的例子中,它意味着立即在'SleepConditionVariableCs'和'EnterCriticalSection'之前立即调用'LeaveCriticalSection'。 –

+0

雷蒙德,如果你写这个答案而不是评论,我会接受它:) –

+2

继续并写下你自己的答案并接受它。 –

回答

0

看来SleepConditionVariableCS只会解锁关键部分一次,这意味着线程#2永远不会运行。