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有什么区别?
正确。 'SleepConditionVariableCs'只能退出关键部分一次。 “EnterCriticalSection”可以在同一个线程中连续调用两次而不会发生死锁,这也是正确的。但是,如果您打算调用'SleepConditionVariableCs',则必须全部退出临界区域(即在您调用'SleepConditionVariableCs'时,输入计数必须恰好为1)。在上面的例子中,它意味着立即在'SleepConditionVariableCs'和'EnterCriticalSection'之前立即调用'LeaveCriticalSection'。 –
雷蒙德,如果你写这个答案而不是评论,我会接受它:) –
继续并写下你自己的答案并接受它。 –