Отказ от объекта-мьютекса
Если какой-то посторонний поток попытается освободить мьютекс вызовом функции ReleaseMutex, то она, проверив идентификаторы потоков и обнаружив их несовпадение, ничего делать не станет, а просто вер нет FALSE. Тут же вызвав GetLastError, Вы получите значение ERROR_NOT_OWNER.
Мьютексы и критические секции
Мьютексы и критические секции одинаковы в том, как они влияют на планирование ждущих потоков, но различны по некоторым другим характеристикам. Эти объекты сравниваются в следующей таблице.
Характеристики | Объект-мьютекс | Обьект — критическая секция |
Быстродействие | Малое | Высокое |
Возможность использования за границами процесса | Да | Нет |
Объявление | HANDLE hmfx; | CRITICAL_SECTION cs; |
Инициализация | hmtx = CreateMutex (NULL, FALSE, NULL); | InitializeCriticalSection(&cs); |
Очистка | CloseHandle(hmtx); | DeleteCriticalSection(&cs); |
Бесконечное ожидание | WaitForSingleObject (hmtx, INFINITE); | EnterCrittcalSection(&cs); |
Ожидание в течение 0 мс | WaitForSingleObject (hmtx, 0); | TryEnterCriticalSection (&cs); |
Ожидание в течение произвольного периода времени | WaitForSingleObject (hmtx, dwMilliseconds); | Невозможно |
Освобождение | ReleaseMutex(hmtx); | LeaveCriticalSecliun(&cs); |
Возможность параллельного ожидания других объектов ядра | Да (с помощью WaitForMultipleObjects или аналогичной функции) | Нет |
Ожидаемые таймеры
Ожидаемые таймеры (waitahle timers) ~ это объекты ядра, которые самостоятельно переходят в свободное состояние в определенное время или через регулярные про межутки времени. Чтобы создать ожидаемый таймер, достаточно вызвать функцию CreateWaitableTimer.
HANDLE CreateWaitableTimer( PSECURITY_ATTRIBUTES psa, BOOL fManualReset, PCTSTR pszName);
Любой процесс может получить свой («процессо-зависимый») описатель существующего объек та "ожидаемый таймер", вызвав OpenWaitableTimer.
HANDLE OpenWaitableTimer( DWORD dwDesiredAccess, BOOL bInheritHandle, PCTSTR pszName);
По аналогии с событиями параметр fManualReset определяет тип ожидаемого тай мера: со сбросом вручную или с автосбросом. Когда освобождается таймер со сбро сом вручную, возобновляется выполнение всех потоков, ожидавших этот объект, а когда в свободное состояние переходит таймер с автосбросом — лишь одного из потоков.
Объекты «ожидаемый таймер» всегда создаются в занятом состоянии. Чтобы со общить таймеру, в какой момент он должен перейти в свободное состояние, вызови те функцию SetWaitableTimer.
BOOL SetWaitableTimer( HANDLE hTimer, const LARGE_INTEGER *pDueTime, LONG lPeriod, PTIMERAPCROUTINE pfnCompletionRoutine, PVOID pvArgToCotnpletionRoutine, BOOI fResume);
Дата добавления: 2017-01-26; просмотров: 1411;