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'。 –
雷蒙德,如果你寫這個答案而不是評論,我會接受它:) –
繼續並寫下你自己的答案並接受它。 –