Это действительно для многоуровневой критической секции?
Например, это действительно?
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 );
Я хотел бы защитить два очень раздела кода с двумя критическими разделами. Я могу это сделать?
Возможные дубликаты: допустимо ли вложение критического раздела?
2 ответа
Если у вас есть несколько блокировок, и в один момент времени можно удерживать более одной блокировки, то вы должны убедиться, что блокировки всегда получаются в одном и том же порядке. Несоблюдение этого может привести к тупику.
Это широко известное и широко обсуждаемое правило. Например, используйте иерархии блокировки, чтобы избежать тупика.
Я думаю, что ваш вопрос отличается от того, который вы упомянули, поскольку у вас есть два различных критических раздела.
В любом случае вы можете вкладывать их, но вы должны позаботиться о том, чтобы вводить / приобретать их всегда в том же порядке, иначе вы рискуете зайти в тупик.