0

2 つの 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

上記のコードからのロックの実装に問題はありますか?

4

1 に答える 1

0

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()
于 2013-10-07T18:32:22.603 に答える