包含另一个关键部分的关键部分?

问题描述:

是否允许下面?:包含另一个关键部分的关键部分?

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

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

@SamCristall:'CRITICAL_SECTION's可以递归获取。但是你需要介意锁定顺序。 –

这样巢关键部分是,这是可以接受的。对于任何稍微复杂的程序来说,在各个地方嵌套许多层是一种规范。

你需要注意的一件事是,你必须始终以相同的顺序锁定。

如果你不这样做,你可能面临危险的僵局像

线程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