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

mac*_*ekm 2 c++ multithreading critical-section

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

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

   LeaveCriticalSection(&g_Variable);  
   ...
   LeaveCriticalSection(&g_List);
}
Run Code Online (Sandbox Code Playgroud)

sim*_*onc 7

是的,这是可以接受的.对于任何稍微复杂的程序来说,在各个地方都有很多层嵌套是常态.

您需要注意的一件事是您必须始终以相同的顺序获取锁.

如果你不这样做,你可能会遇到像以下情况一样的死锁风险

线程A运行如下代码:

EnterCriticalSection(&g_List); 
EnterCriticalSection(&g_Variable); 
...
LeaveCriticalSection(&g_Variable);  
LeaveCriticalSection(&g_List);
Run Code Online (Sandbox Code Playgroud)

但是线程B运行

EnterCriticalSection(&g_Variable); 
EnterCriticalSection(&g_List); 
...
LeaveCriticalSection(&g_List);
LeaveCriticalSection(&g_Variable);  
Run Code Online (Sandbox Code Playgroud)

这可能导致死锁,其中线程A锁定g_List然后阻塞等待,g_Variable而线程B已锁定g_Variable并被阻塞等待g_List