Страницы

Поиск по вопросам

воскресенье, 9 февраля 2020 г.

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

#многопоточность #cpp #исключения


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

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


Ответы

Ответ 1



Код вполне корректен, но я бы посоветовал отказаться от переменных типа бул для синхронизации. Вы можете сделать, к примеру, так: try { // ... try { EnterCriticalSection(&cs); // ... LeaveCriticalSection(&cs); } catch(...) { // Ловим все исключения... LeaveCriticalSection(&cs); throw; // ...и пробрасываем их дальше. } // ... } catch(SomeException&) { // ... } А вообще, лучше сделать умную критическую секцию. Создать объект, в конструкторе вызвать EnterCriticalSection(&cs), а в деструкторе LeaveCriticalSection(&cs). Тогда при раскрутке стека критическая секция будет освобождена.

Комментариев нет:

Отправить комментарий