2012-10-11 88 views
0

據我所知,在Windows上CRITICAL_SECTION只能用作非遞歸互斥量。要獲得遞歸互斥鎖,你必須使用OpenMutex和朋友。Windows上的遞歸互斥?

然而,AFAIU,Win32的互斥鎖不能與條件變量使用(InitializeConditionVariable等)

有沒有結合在Windows上使用遞歸互斥體與條件變量的方法嗎?

+1

你明白錯誤。關鍵部分(就互斥體而言)**可以**遞歸使用。 – valdo

回答

4

valdo的評論是正確的。 CRITICAL_SECTION 遞歸。下面是MSDN的一句話:「線程擁有關鍵部分的所有權後,可以對EnterCriticalSection或TryEnterCriticalSection進行額外調用,而不會阻止其執行。」問題解決了。

0

這只是沒有任何意義。從語義上講,條件變量的意義在於,當你等待時你可以原子地釋放鎖 - 從而允許其他線程獲取鎖來執行你正在等待的東西。然而,遞歸互斥體上的「釋放」操作可能實際上並未解鎖它,因此在發佈後等待可能會死鎖。事實上,你想要一種方式來強有力地表明你的設計或你對條件變量的理解有些問題。

想想吧 - 當持有遞歸互斥鎖的函數調用獲取第二鎖功能,然後調用休眠功能會發生什麼情況?如果鎖被釋放,則第一個函數的邏輯將會中斷,因爲對象將在其上被鎖定時被修改。如果鎖沒有被釋放,那麼等待將會死鎖,因爲它等待的東西永遠不會發生,因爲它持有另一個線程需要的鎖來實現它。

有使用條件變量不知道你是否就可以有一個鎖已經沒有合理的方式。如果你知道你是否有鎖,那就不需要遞歸鎖定功能。如果你知道你已經有一個鎖,不要打擾調用鎖定功能。如果你知道你還沒有鎖,即使它不是遞歸的,鎖功能也可以正常工作。

+0

在我的用例中,只有在等待完成後纔會對互斥量進行遞歸訪問。因此沒有問題。 –

+0

由於您正在跟蹤何時遞歸使用互斥體,何時不使用互斥體,因此不需要遞歸互斥體。當您遞歸使用它時,只需不要打擾調用鎖定/解鎖功能。 –

+0

我將不得不在某處存儲狀態(遞歸與非遞歸)。這個存儲本身必須抵抗多線程的同時訪問。這將意味着使用原子。等太複雜。如上所述,CRITICAL_SECTION *是*遞歸的,所以沒問題。無論如何感謝您的幫助! –