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

时间:2014-01-17 23:00:19

标签: c++ multithreading critical-section

是否可以在下面嵌套关键部分?:

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

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

1 个答案:

答案 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