Использование обработчика завершения
В следующем примере показано, как обработчик завершения используется для обеспечения освобождения ресурсов при завершении выполнения защищенного текста кода. В этом случае поток использует функцию 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);
}