Разработка многопоточных приложений. Рудалев В.Г - 17 стр.

UptoLike

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