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


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

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