Это действительно для многоуровневой критической секции?

Например, это действительно?

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 ответа

Решение

Если у вас есть несколько блокировок, и в один момент времени можно удерживать более одной блокировки, то вы должны убедиться, что блокировки всегда получаются в одном и том же порядке. Несоблюдение этого может привести к тупику.

Это широко известное и широко обсуждаемое правило. Например, используйте иерархии блокировки, чтобы избежать тупика.

Я думаю, что ваш вопрос отличается от того, который вы упомянули, поскольку у вас есть два различных критических раздела.

В любом случае вы можете вкладывать их, но вы должны позаботиться о том, чтобы вводить / приобретать их всегда в том же порядке, иначе вы рискуете зайти в тупик.

Другие вопросы по тегам