在Lua通道之间共享全局变量
我想在两条车道之间共享一个全局变量,其想法是,当lane1更新一个共享变量时,我应该能够在lane2上获得它的更新值,当它被调度时。有解决办法吗 下面的代码片段:-在Lua通道之间共享全局变量,lua,global-variables,scope,lua-lanes,Lua,Global Variables,Scope,Lua Lanes,我想在两条车道之间共享一个全局变量,其想法是,当lane1更新一个共享变量时,我应该能够在lane2上获得它的更新值,当它被调度时。有解决办法吗 下面的代码片段:- shared_variable = 0 local function lane1() .. shared_variable = shared_variable + 1 end local function lane2() .. print(shared_variable)-->shared v
shared_variable = 0
local function lane1()
..
shared_variable = shared_variable + 1
end
local function lane2()
..
print(shared_variable)-->shared variable is not getting updated,always prints 0
end
Thread1= lanes.gen("*",{globals = _G},lane1)
Thread2= lanes.gen("*",{globals = _G},lane2)
T1 = Thread1()
T2 = Thread2()
T1:join()
T2:join()
您必须自己使用lindas来同步变量-以下是文档: 下面是您的代码的固定版本:
require("lanes")
shared_variable = 0
local linda = lanes.linda()
local function lane1()
while true do
shared_variable = shared_variable + 1
linda:send("var", shared_variable)
end
end
local function lane2()
while true do
local v = linda:receive("var")
print(v)
end
end
Thread1= lanes.gen("*",{globals = _G},lane1)
Thread2= lanes.gen("*",{globals = _G},lane2)
T1 = Thread1()
T2 = Thread2()
T1:join()
T2:join()
下面是我们可以在车道之间共享变量的示例实现(使用set&get方法)
谢谢Gran..您告诉我的解决方案不是我想要的,这将给实现带来额外的开销和复杂性。根据Lua文档,有一个luaG_deep_userdata()的概念来解决此类问题,但我不知道如何从文档中实现它。@Anoop deep userdata是一个概念,而不是Lua概念。它不会比使用Linda更简单,尽管你想使用
get
和set
而不是send
/receive
(在Lanes doc中搜索:get
)@dualed我在回答这个问题时,一开始实际上使用了get
和set
,但是它导致Lua崩溃…@GranPC这很不幸,但是用发送/接收实现“SHM”有点复杂,您必须执行类似于locallock=lanes.genlock(…);[…]锁(1);本地x=linda:receive(foo);琳达:发送(foo,x);锁(-1)代码>而这只适用于set
。meh.:)我认为最好解决崩溃问题。发送和接收更新共享变量的消息不是一个好概念。原因是,我计划安排一个线程(T1)5秒,另一个线程(T2)0.5秒。从T2向T1发送信息的目的是为了让T1进入深度睡眠。这就是我寻找共享变量机制的地方,T1可以使用T2可能已经更新的共享变量。
require("lanes")
shared_variable = 0
local linda = lanes.linda()
local function lane1()
while true do
shared_variable = shared_variable + 1
linda:set("var", shared_variable)
end
end
local function lane2()
while true do
local v = linda:get("var")
print(v)
end
end
Thread1= lanes.gen("*",{globals = _G},lane1)
Thread2= lanes.gen("*",{globals = _G},lane2)
T1 = Thread1()
T2 = Thread2()
T1:join()
T2:join()