PureBasic

CreateMutex()

Синтаксис

Mutex = CreateMutex()

Описание


Создаёт новый объект Мьютекс. Мьютекс изначально является разблокированным.

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

Например, если Вам требуется, чтобы определённый код мог выполняться не больше чем одним потоком одновременно, создайте Мьютекс с помощью команды var1=CreateMutex(), и поместите требуемый участок кода между командами LockMutex(var1) и UnlockMutex(var1).
Тогда команда LockMutex(var1) позволит использовать защищаемый участок кода только одному потоку, остальные потоки остановятся на входе и будут ждать своей очереди, она наступит, когда текущий поток минует команду UnlockMutex(var1) и тем самым освободит участок кода для следующего потока из очереди.
Больше информации про блокировку/разблокировку Мьютекса можно почитать в описании выше названных функций.

Параметры

Нет.

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

Возвращает идентификационный Номер Мьютекса, если он был успешно создан, в противном случае 0.

Пример

; Выполните этот код как есть. Вы увидите, что напечатанные строки
; от разных потоков перемешаны. Теперь раскомментируйте функции работы с Мьютексом и
; строки напечатаются по порядку, потому что одновременно только один поток
; имеет право выполнять функции печати.
;
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()

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

Все

Оглавление Thread - CreateSemaphore() ->