Поделиться через


Использование обработчика завершения

В следующем примере показано, как обработчик завершения используется для обеспечения освобождения ресурсов при завершении выполнения защищенного текста кода. В этом случае поток использует функцию EnterCriticalSection для ожидания владения критически важным объектом раздела. Когда поток завершит выполнение кода, защищенного критическим разделом, он должен вызвать функцию LeaveCriticalSection, чтобы сделать критически важный объект раздела доступным для других потоков. Использование обработчика завершения гарантирует, что это произойдет. Дополнительные сведения см. в разделе критически важных объектов разделов.

LPTSTR lpBuffer = NULL; 
CRITICAL_SECTION CriticalSection; 

// EnterCriticalSection synchronizes code with other threads. 
EnterCriticalSection(&CriticalSection); 
 
__try 
{ 
    // Perform a task that may cause an exception. 
    lpBuffer = (LPTSTR) LocalAlloc(LPTR, 10); 
    StringCchCopy(lpBuffer, 10, TEXT("Hello"));

    _tprintf(TEXT("%s\n"),lpBuffer); 
    LocalFree(lpBuffer); 
} 
__finally 
{ 
    // LeaveCriticalSection is called even if an exception occurred. 
    LeaveCriticalSection(&CriticalSection); 
}