临界截面的多层化是否有效?

Is it valid to mutilayered a critical section?

本文关键字:是否 有效 截面      更新时间:2023-10-16

例如,这是否有效?

CRITICAL_SECTION cs_A;
CRITICAL_SECTION cs_b;
::InitializeCriticalSection( &cs_A );
::InitializeCriticalSection( &cs_B );
::EnterCriticalSection( &cs_A );      // First level
/* do some stuff with A */
::EnterCriticalSection( &cs_B );        // Second level
/* do some stuff with A and B */
::LeaveCriticalSection( &cs_B );        // Second level
/* do some stuff with A */
::LeaveCriticalSection( &cs_A );      // First level
::DeleteCriticalSection( &cs_A );
::DeleteCriticalSection( &cs_B );

我想用两个临界区保护两段代码。我可以这样做吗?

可能的重复:嵌套临界区有效吗?

当您有多个锁并且可能在一个时间点持有多个锁时,您必须确保总是以相同的顺序获得锁。如果没有注意到这一点,可能会导致死锁。

这是一个广为人知并被广泛讨论的规则。例如,使用锁层次结构来避免死锁

我认为你的问题与你提到的问题不同,因为你有两个不同的关键部分。

无论如何,你可以嵌套它们,但你必须注意输入/获取它们的顺序总是相同的,否则你会冒死锁的风险。