2015-06-08 23 views
1

例如,這是否有效?它是否適用於多層次的關鍵部分?

CRITICAL_SECTION cs_A; 
CRITICAL_SECTION cs_b; 

::InitializeCriticalSection(&cs_A); 
::InitializeCriticalSection(&cs_B); 

::EnterCriticalSection(&cs_A);  // First level 

/* do some stuff with A */ 

::EnterCriticalSection(&cs_B);  // Second level 

/* do some stuff with A and B */ 

::LeaveCriticalSection(&cs_B);  // Second level 

/* do some stuff with A */ 

::LeaveCriticalSection(&cs_A);  // First level 

::DeleteCriticalSection(&cs_A); 
::DeleteCriticalSection(&cs_B); 

我想用兩個關鍵部分保護兩段代碼。 我可以這樣做嗎?

可能重複: Is it valid to nest a critical section?

+0

出於好奇:爲什麼不使用C++ 11併發庫? –

回答

1

無論何時您擁有多個鎖並且在一個時間點上可以保持多個鎖時,您必須確保始終以相同的順序獲取這些鎖。不遵守這一點會導致死鎖。

這是一個廣爲人知和廣泛討論的規則。例如,Use Lock Hierarchies to Avoid Deadlock

0

我覺得你的問題是不同的形式,你提到的一個,因爲你有兩個不同關鍵部分。

無論如何,你可以將它們嵌套在一起,但你必須小心地按照相同的順序輸入/獲取它們,否則你就會陷入僵局。