2011-11-03 66 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永遠不會運行。