包含另一个关键部分的关键部分?
问题描述:
是否允许下面?:包含另一个关键部分的关键部分?
void somefunction()
{
EnterCriticalSection(&g_List);
...
EnterCriticalSection(&g_Variable);
...
LeaveCriticalSection(&g_Variable);
...
LeaveCriticalSection(&g_List);
}
答
这样巢关键部分是,这是可以接受的。对于任何稍微复杂的程序来说,在各个地方嵌套许多层是一种规范。
你需要注意的一件事是,你必须始终以相同的顺序锁定。
如果你不这样做,你可能面临危险的僵局像
线程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
@SamCristall:'CRITICAL_SECTION's可以递归获取。但是你需要介意锁定顺序。 –