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

Critical section containing another critical section?

本文关键字:键部 另一个 包含      更新时间:2023-10-16

是否允许像下面这样嵌套关键部分?

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

相关文章: