2015-06-08 2 views
1

Например, это действительно?Действительно ли он имеет mutilayered критический раздел?

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?

+0

просто из любопытства: почему бы не использовать библиотеку параллелизма C++ 11? –

ответ

1

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

Это широко известное и широко обсуждаемое правило. Например, Use Lock Hierarchies to Avoid Deadlock.

0

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

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

Смежные вопросы