Тема: AHK: именные мьютексы, лок и анлок
Читал много статей про мьютексы, вникал в суть работы и вроде бы написал рабочие функции, но спустя время выяснилось, что они не работают.
Задача: синхронизировать потоки через именной мьютекс. Второй поток не должен начинать действовать, пока не получит мьютекс от первого потока.
Проблема: при каждом вызове функции lock() поток получает новый мьютекс, даже если мьютекс с таким же именем уже существует. Возможно, там каким-то образом включается рекурсия. Использую ahk v2 (h)
Код:
lock(name)
{
mutex := DllCall("OpenMutex", "UInt", 0x00100000, "Int", null, "Str", name)
if ( mutex > 0 )
{
result := GetAccess(mutex)
return mutex
}
else
{
mutex := DllCall("CreateMutex", "UInt", 0, "UInt", 0, "Str", name)
result := GetAccess(mutex)
return mutex
}
}
GetAccess(mutex, timeoutms:=0xbb8)
{
loop 10
{
result := DllCall("WaitForSingleObject", "UInt", mutex, "UInt", timeoutms)
if ( result != 0)
{
return result
}
}
return "ERROR"
}
unlock(mutex)
{
return DllCall("ReleaseMutex", "UInt", mutex)
}
Как это выглядит в рабочем коде:
mutex := lock('some_name')
; some code...
unlock(mutex)
Как сделать функции рабочими?