多层关键部分是否有效?
Is it valid to mutilayered a critical section?
例如,这个有效吗?
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 );
我想用两个临界区来保护两段代码。
我可以这样做吗?
可能重复:
Is it valid to nest a critical section?
我认为你的问题与你提到的不同,因为你有 两个不同的 关键部分。
无论如何你都可以嵌套它们,但是你必须注意enter/acquire它们总是以相同的顺序排列,否则你有死锁的风险。
当您有多个锁并且在一个时间点可能持有多个锁时,您必须确保始终以相同的顺序获取锁。不遵守这一点可能会导致死锁。
这是一个广为人知和广泛讨论的规则。例如,Use Lock Hierarchies to Avoid Deadlock.
例如,这个有效吗?
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 );
我想用两个临界区来保护两段代码。 我可以这样做吗?
可能重复: Is it valid to nest a critical section?
我认为你的问题与你提到的不同,因为你有 两个不同的 关键部分。
无论如何你都可以嵌套它们,但是你必须注意enter/acquire它们总是以相同的顺序排列,否则你有死锁的风险。
当您有多个锁并且在一个时间点可能持有多个锁时,您必须确保始终以相同的顺序获取锁。不遵守这一点可能会导致死锁。
这是一个广为人知和广泛讨论的规则。例如,Use Lock Hierarchies to Avoid Deadlock.