SignalSemaphore()
Синтаксис
SignalSemaphore(Semaphore)
Описание
Увеличивает внутренний счётчик Семафора на единицу, освобождая ожидающий поток, если таковой есть.
Параметры
Semaphore Номер, идентифицирующий объект Семафор, который должен подать сигнал.
Возвращаемое значение
Ничего.
Комментарии
Примечание: Счётчик Семафора ограничен знаковым 32-битным значением, поэтому можно сделать максимум 2147483647 вызовов функции SignalSemaphore(), каждый из которых будет сбалансирован вызовом функции WaitSemaphore().
Пример
Этот пример показывает поток "производитель", заполняющий очередь элементами, и главный поток, читающий их. Семафор используется чтобы гарантировать, что очередь никогда не опустеет. Заметьте, того же можно добиться с помощью только Мьютекса и операций ожидания/опроса очереди вперемежку с вызовами функции Delay(), но команды Семафора реализуют более эффективное ожидание (возвращаясь сразу из вызова функции SignalSemaphore(), а не в следующий раз, когда цикл опроса проверит очередь).Global Semaphore = CreateSemaphore() Global Mutex = CreateMutex() Global NewList Queue() Procedure Producer(Total) For i = 1 To Total Delay(Random(750) + 250) ; Работа с очередью всё же требует нормальной блокировки через Мьютекс для потокобезопасности LockMutex(Mutex) LastElement(Queue()) AddElement(Queue()) Queue() = i UnlockMutex(Mutex) ; Сигнализируем, что в очереди новый элемент SignalSemaphore(Semaphore) Next i EndProcedure If CreateThread(@Producer(), 30) For i = 1 To 30 ; ожидаем наличия одного элемента WaitSemaphore(Semaphore) ; отображаем состояние очереди LockMutex(Mutex) Queue$ = "Queue:" ForEach Queue() Queue$ + " " + Str(Queue()) Next Queue() Debug Queue$ ; удаляем головной элемент из очереди FirstElement(Queue()) DeleteElement(Queue()) UnlockMutex(Mutex) Next i EndIf
Поддерживаемые OS
Все