Замок между переулками Луа

Я пытаюсь использовать блокировки между двумя линиями Lua, но заметил, что обе линии одновременно входят в lock_func. Ниже приведен фрагмент

Code Snippet
==================

require"lanes"

local linda = lanes.linda()
lock_func = lanes.genlock(linda,"M",1)

local function lock_func()
    print("Lock Acquired")
    while(true) do

    end
end


local function readerThread()

print("readerThread acquiring lock")

lock_func()

end

local function writerThread()

print("writerThread acquiring lock")
lock_func()


end


Thread1= lanes.gen("*",{globals = _G},writerThread)
Thread2= lanes.gen("*",{globals = _G},readerThread)

T1 = Thread1()
T2 = Thread2()

T1:join()
T2:join()

Из приведенного ниже вывода видно, что обе дорожки одновременно вошли в функцию lock_func.

output
==================
writerThread acquiring lock
Lock Acquired
readerThread acquiring lock
Lock Acquired

Есть ли проблемы с реализацией блокировки из приведенного выше кода?

1 ответ

Решение

Реализация блокировок в lua может быть выполнена как в следующем фрагменте кода. Из приведенного ниже кода будет выполняться только распечатка с линии записи или читателя, поскольку любая линия, получающая блокировку, попадет в бесконечный цикл (просто чтобы увидеть, как блокировки работают должным образом), а другая линия будет ожидать освобождения блокировки,

require"lanes"

local linda = lanes.linda()
f = lanes.genlock(linda,"M",1)


local function readerThread()
require"lanes"

f(1)
print("readerThread acquiring lock")
while(true) do
end
f(-1)

end

local function writerThread()
require"lanes"

f(1)
print("writerThread acquiring lock")
while(true) do
end
f(-1)

end


Thread1= lanes.gen("*",{globals = _G},writerThread)
Thread2= lanes.gen("*",{globals = _G},readerThread)

T1 = Thread1()
T2 = Thread2()

T1:join()
T2:join()
Другие вопросы по тегам