CRITICAL_SECTION / CONDITION_VARIABLE Win32中的死锁

时间:2011-11-03 19:17:16

标签: multithreading winapi

为什么这段代码会导致死锁?

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有什么区别?

1 个答案:

答案 0 :(得分:0)

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