Отказ от объекта-мьютекса


Если какой-то посторонний поток попытается освободить мьютекс вызовом функции 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; просмотров: 1401;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.007 сек.