例如,這是否有效?嵌套臨界區是否有效?
CRITICAL_SECTION cs;
::InitializeCriticalSection(&cs);
::EnterCriticalSection(&cs); // First level
::EnterCriticalSection(&cs); // Second level
/* do some stuff */
::LeaveCriticalSection(&cs); // Second level
::LeaveCriticalSection(&cs); // First level
::DeleteCriticalSection(&cs);
很顯然,我決不會有意這樣做,但如果這個人來大約爲功能的調用效果,使得「第一等級」被稱爲鎖定對象的複雜(例如,搜索)算法和「第二級」在該對象的訪問函數中被調用?
+1不知道那一個! – Valmond
同樣適用於所有其他類型的同步對象 - 互斥鎖,信號量等。一旦線程獲得鎖定,就可以多次重新進入鎖定而無需阻塞。只要確保釋放鎖定的次數與您輸入的次數相同,以便它可以正確釋放以供其他線程獲取。 –
@Remy:不,它不適用於所有其他類型的同步對象。你當然可以擁有不可重入的互斥體。 –