|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
Using a Termination Handler
The following example shows how a try-finally statement is used to ensure that resources are released when execution of a guarded body of code terminates. In this case, a thread uses the EnterCriticalSection function to wait for ownership of a critical section object. When the thread is finished executing the code that is protected by the critical section, it must call the LeaveCriticalSection function to make the critical section object available to other threads. Using a try- finally statement guarantees that this will happen.
For more information about critical section objects, see Synchronization.
LPTSTR lpBuffer = NULL; CRITICAL_SECTION csCriticalSection; try { // EnterCriticalSection synchronizes code // with other threads. EnterCriticalSection(&CriticalSection); // Perform a task that may cause an exception. lpBuffer = (LPTSTR) LocalAlloc(LPTR, 10); strcpy(lpBuffer,"Hello"); // possible access violation printf("%s\n",lpBuffer); LocalFree(lpBuffer); } // LeaveCriticalSection is called even if
// an exception occurred. finally { LeaveCriticalSection(&CriticalSection); }
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
Использование Вручителя Завершения
Следующий пример показывает как попытка-наконец утверждение использована, чтобы проверять, что ресурсы выпущены когда выполнение охраняющего тела кода завершается. В этом случае, резьба использует функцию EnterCriticalSection, чтобы ждать собственность на критический объект секции. Когда резьба завершена выполняя код, который защищен критической секцией, это должно назвать функцию LeaveCriticalSection, чтобы делать критическим объектом секции пригодным для другой резьбы. Использование tryfinally утверждения гарантирует, что это случится.
Более подробно о критических объектах секции, смотри Синхронизацию.
LPTSTR lpBuffer = НЕДЕЙСТВИТЕЛЬНЫЙ; CRITICAL_SECTION csCriticalSection; попытка { // EnterCriticalSection СИНХРОНИЗИРУЕТ код // с другой резьбой. EnterCriticalSection(&CriticalSection); // Выполните задачу, которая может вызвать исключение. lpBuffer = (LPTSTR) LocalAlloc(LPTR, 10); strcpy(lpBuffer,"Hello"); // возможное нарушение доступа printf("%s\n",lpBuffer); LocalFree(lpBuffer); } // LeaveCriticalSection НАЗВАН даже если бы
// исключение происходило. наконец { LeaveCriticalSection(&CriticalSection); }
|
|
|
|
| |