ВУЗ:
Составители:
Рубрика:
17
Параметр dwMilliseconds может принимать значение Infinite, что означает
бесконечный интервал ожидания .
Функция завершает работу, если мьютекс становится сигнальным или ис-
текло время ожидания . После этого поток, находившийся в состоянии ожидания
мьютекса, получает к нему доступ , а мьютекс, получивший нового владельца, пе-
рестает сигнализировать . Мьютекс можно сравнить с «эстафетной палочкой» , ко -
торую бегун (поток) молча держит, проходя дистанцию , и кричит «Держи!» (сиг -
нализирует), завершив дистанцию .
После того, как поток выполнил участок кода, содержащий совместно ис-
пользуемый ресурс, необходимо освободить мьютекс от потока- владельца с по-
мощью функции API
function ReleaseMutex(
hHandle: THandle; // дескриптор мьютекса
): Boolean;
При завершении работы мьютекс удаляется из памяти с помощью извест -
ной Вам функции CloseHandle, в которую передается дескриптор мьютекса.
Семафор создается функцией
function CreateSemaphore (
Attr: Pointer; // указатель на атрибуты безопасности
InitialCount: longint; // Начальное число потоков,
// допущенных к объекту
MaxCount: longint; // Максимальное число допускаемых
// потоков
lpName: PChar // указатель на имя семафора
): THandle; // дескриптор семафора
Семафор сигнализирует, если InitialCount больше нуля, и не подает сигна-
ла, если InitialCount равен нулю .
Для доступа к объекту используется функция ожидания
WaitForSingleObject или WaitForMultipleObjects [6].
При завершении функции ожидания значение счетчика InitialCount соот-
ветственно уменьшается и поток получает доступ к ресурсу .
При завершении доступа к ресурсу необходимо вызвать функцию , увели-
чивающую значение счетчика семафора:
function ReleaseSemaphore(
hHandle: THandle;
// дескриптор семафора
ReleaseCount: longint // приращение счетчика
LP: Pointer // как правило, nil
): Boolean;
Более подробная информация приведена в [6].
Упражнение: Переделайте лабораторную работу № 4, заменив критиче-
ские секции а ) мьютексами, б ) семафорами.
П араметр dwMilliseconds мож етп ринимать значениеInfinite, что означает б есконечны й интервал ож идания. Ф ункция заверш ает раб оту, еслимью тексстановится сиг нальны м илиис- текло время ож идания. П ос леэтог о п оток, находивш ийся в состоянииож идания мью текса, п олучаетк нему дос туп , амью текс, п олучивш ий новог о владельца, п е- рестаетсиг нализировать. М ью тексмож но с равнить с« эстаф етной п алочкой», ко- торую б ег ун (п оток) молчадерж ит, п роходя дистанцию , икричит« Д ерж и!» (сиг - нализирует), заверш ив дистанцию . П ос ле тог о, как п оток вы п олнил участок кода, содерж ащ ий совместно ис- п ользуемы й ресурс, необ ходимо освоб одить мью тексот п отока-владельцасп о- мощ ью ф ункцииAPI function ReleaseMutex( hHandle: THandle; // дескриптор мьютекса ): Boolean; П ризаверш ениираб оты мью тексудаляется изп амятисп омощ ью извест- ной В ам ф ункцииCloseHandle, в которую п ередается дескрип тор мью текса. С ем афор с оздается ф ункцией function CreateSemaphore ( Attr: Pointer; // указатель на атрибуты безопасности InitialCount: longint; // Начальное число потоков, // допущенных к объекту MaxCount: longint; // Максимальное число допускаемых // потоков lpName: PChar // указатель на имя семафора ): THandle; // дескриптор семафора Семаф ор сиг нализирует, еслиInitialCount б ольш енуля, инеп одаетсиг на- ла, еслиInitialCount равен нулю . Д ля доступ а к об ъ екту исп ользуется ф ункция ож идания WaitForSingleObject или WaitForMultipleObjects [6]. П ризаверш ении ф ункции ож идания значение с четчикаInitialCount соот- ветственно уменьш ается ип оток п олучаетдоступ к ресурс у. П ризаверш ениидоступ ак ресурс у необ ходимо вы звать ф ункцию , увели- чиваю щ ую значениесчетчикасемаф ора: function ReleaseSemaphore( hHandle: THandle; // дескриптор семафора ReleaseCount: longint // приращение счетчика LP: Pointer // как правило, nil ): Boolean; Болееп одроб ная инф ормация п риведенав [6]. Упр аж н е : П еределайте лаб ораторную раб оту № 4, заменив критиче- н ие скиесекцииа) мью тексами, б ) семаф орами. 17