【问题标题】:Critical section containing another critical section?包含另一个关键部分的关键部分?
【发布时间】:2014-02-07 11:20:25
【问题描述】:

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

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

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

【问题讨论】:

  • @SamCristall: CRITICAL_SECTIONs 可以递归获取。但是您确实需要注意锁定顺序。

标签: c++ multithreading critical-section


【解决方案1】:

是的,这是可以接受的。任何稍微复杂的程序都有多层嵌套是常态。

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

如果你不这样做,你可能会在类似的场景中陷入死锁

线程 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-20
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    • 2018-08-16
    • 1970-01-01
    • 2020-09-17
    相关资源
    最近更新 更多