2014-01-17 108 views
2

是否允許下面?:包含另一個關鍵部分的關鍵部分?

void somefunction() 
{ 
    EnterCriticalSection(&g_List); 
    ... 
    EnterCriticalSection(&g_Variable); 
    ... 

    LeaveCriticalSection(&g_Variable); 
    ... 
    LeaveCriticalSection(&g_List); 
} 
+1

@SamCristall:'CRITICAL_SECTION's可以遞歸獲取。但是你需要介意鎖定順序。 –

回答

7

這樣巢關鍵部分是,這是可以接受的。對於任何稍微複雜的程序來說,在各個地方嵌套許多層是一種規範。

你需要注意的一件事是,你必須始終以相同的順序鎖定。

如果你不這樣做,你可能面臨危險的僵局像

線程A上運行的代碼,如:

EnterCriticalSection(&g_List); 
EnterCriticalSection(&g_Variable); 
... 
LeaveCriticalSection(&g_Variable); 
LeaveCriticalSection(&g_List); 

但線程B運行

EnterCriticalSection(&g_Variable); 
EnterCriticalSection(&g_List); 
... 
LeaveCriticalSection(&g_List); 
LeaveCriticalSection(&g_Variable); 

這個風險死鎖其中線程A鎖定g_List,然後阻塞等待g_Variable,同時線程B已鎖定g_Variable並被阻止等待g_List