Исключения С++ и критические секции

Рейтинг: 3Ответов: 1Опубликовано: 22.01.2011

Корректен ли код?

bool started_cs = false;  
try {  
    // ...  
    EnterCriticalSection(&cs);  
    started_cs = true;  
    // ...  
    LeaveCriticalSection(&cs);  
    started_cs = false;  
} catch(SomeException&) {  
    if (started_cs)  
        LeaveCriticalSection(&cs);  
    // ...  
}

Ответы

▲ 7Принят

Код вполне корректен, но я бы посоветовал отказаться от переменных типа бул для синхронизации. Вы можете сделать, к примеру, так:

try {  
// ...  

    try {
        EnterCriticalSection(&cs); 
        // ...  
        LeaveCriticalSection(&cs); 
    } catch(...) {  // Ловим все исключения...   
        LeaveCriticalSection(&cs);  
        throw;      // ...и пробрасываем их дальше.
    }
// ...  
} catch(SomeException&) {
    // ...
}

А вообще, лучше сделать умную критическую секцию. Создать объект, в конструкторе вызвать EnterCriticalSection(&cs), а в деструкторе LeaveCriticalSection(&cs). Тогда при раскрутке стека критическая секция будет освобождена.