是否可以在下面嵌套关键部分?:
void somefunction()
{
EnterCriticalSection(&g_List);
...
EnterCriticalSection(&g_Variable);
...
LeaveCriticalSection(&g_Variable);
...
LeaveCriticalSection(&g_List);
}
答案 0 :(得分: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