PureBasic

LockMutex()

Синтаксис

LockMutex(Mutex)

Описание


Блокирует объект Мьютекс (если он не заблокирован). Если Мьютекс уже заблокирован другим потоком, функция будет ожидать, пока Мьютекс не освободится, затем блокирует его, во время блокировки никакой другой поток не сможет его заблокировать и получить доступ к разделяемому ресурсу.

По возвращении из этой функции гарантируется, что этот поток единственный обладает блокировкой Мьютекса. Теперь поток может свободно работать с разделяемым ресурсом, защищаемым данным Мьютексом, так как он единственный обладает исключительным доступом к Мьютексу и соответственно к разделяемому ресурсу.

Если другой поток вызовет функцию LockMutex(), пока этот поток удерживает блокировку, он будет ждать внутри (в стеке) функции LockMutex(), пока блокирующий поток не вызовет функцию UnlockMutex() чтобы снять свою блокировку с Мьютекса.

Примечание: Поскольку функция LockMutex() ждёт освобождения Мьютекса, она легко может завести в тупиковые ситуации если не сделан вызов функции UnlockMutex().

Параметры

Mutex Номер, идентифицирующий объект Мьютекс, который требуется заблокировать.

Возвращаемое значение

Ничего.

Пример

; Выполните этот код как есть. Вы увидите, что напечатанные строки
; от разных потоков перемешаны. Теперь раскомментируйте функции работы с Мьютексом и
; строки напечатаются по порядку, потому что одновременно только один поток
; имеет право выполнять функции печати.
;
Procedure WithoutMutex(*Number)
    Shared Mutex

    For a = 1 To 5
        ;LockMutex(Mutex) ; раскомментируйте это и увидите разницу, отсюда код будет защищён Мьютексом

        PrintN("Поток "+Str(*Number)+": Trying to print 5x in a row:")
        For b = 1 To 5
            Delay(50)
            PrintN("Поток "+Str(*Number)+" Line "+Str(b))
        Next b

        ;UnlockMutex(Mutex) ; раскомментируйте это и увидите разницу, до этой строчки код будет защищён Мьютексом
    Next a
EndProcedure

OpenConsole()
Mutex = CreateMutex() ; создаём Мьютекс и запоминаем его Номер в переменную Mutex, он будет использован в функциях блокировки

thread1 = CreateThread(@WithoutMutex(), 1)
Delay(25)
thread2 = CreateThread(@WithoutMutex(), 2)
Delay(25)
thread3 = CreateThread(@WithoutMutex(), 3)

WaitThread(thread1)
WaitThread(thread2)
WaitThread(thread3)

Input()

См. также

UnlockMutex(), CreateMutex()

Поддерживаемые OS

Все

<- KillThread() - Оглавление Thread - PauseThread()->