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)
是的,这是可以接受的.对于任何稍微复杂的程序来说,在各个地方都有很多层嵌套是常态.
您需要注意的一件事是您必须始终以相同的顺序获取锁.
如果你不这样做,你可能会遇到像以下情况一样的死锁风险
线程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
| 归档时间: |
|
| 查看次数: |
149 次 |
| 最近记录: |