Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Lua通道之间共享全局变量_Lua_Global Variables_Scope_Lua Lanes - Fatal编程技术网

在Lua通道之间共享全局变量

在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

我想在两条车道之间共享一个全局变量,其想法是,当lane1更新一个共享变量时,我应该能够在lane2上获得它的更新值,当它被调度时。有解决办法吗

下面的代码片段:-

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()