【问题标题】:Sharing a global variable between Lua lanes在 Lua 通道之间共享一个全局变量
【发布时间】:2013-10-05 09:16:36
【问题描述】:

我想在 2 个通道之间共享一个全局变量,这个想法是当通道 1 更新一个共享变量时,我应该能够在通道 2 被调度时获得它的更新值。有解决办法吗?

代码片段如下:-

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

【问题讨论】:

    标签: lua global-variables scope lua-lanes


    【解决方案1】:

    下面是示例实现,我们可以在通道之间共享一个变量(使用 set & get 方法)

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

    【讨论】:

      【解决方案2】:

      您必须自己使用 lindas 来同步变量 - 这是文档:

      http://kotisivu.dnainternet.net/askok/bin/lanes/#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()
      

      【讨论】:

      • 谢谢 Gran..你告诉我的解决方案不是我想要的,这会给实现带来额外的开销和复杂性。根据 Lua 文档,有一个 luaG_deep_userdata() 的概念来解决此类问题,但我缺少如何从文档中实现它..
      • @Anoop Deep userdata 是一个 Lanes 概念,而不是 Lua 概念。它不会比使用 Linda 更简单,但您可能希望使用 getset 而不是 send/receive(在 Lanes doc 中搜索 :get
      • @dualed 我在回答这个问题的时候实际上是在使用getset,但是它导致Lua崩溃了......
      • @GranPC 很不幸,但是使用发送/接收实现“SHM”有点复杂,您必须执行类似local lock = lanes.genlock(...); [...] lock(1); local x = linda:receive(foo); linda:send(foo, x); lock(-1); 的操作,而这仅适用于set。嗯。 :) 我认为最好解决崩溃的问题。
      • 发送和接收更新共享变量的消息不是一个好概念。原因是,我计划安排其中一个线程(T1)5 秒,定时器和其他线程(T2)0.5 秒。从 T2 向 T1 发送消息超出了 T1 进入深度睡眠的目的。这就是我正在寻找一种共享变量机制的地方,其中 T1 可以使用 T2 可能已更新的共享变量。
      猜你喜欢
      • 1970-01-01
      • 2018-12-22
      • 1970-01-01
      • 1970-01-01
      • 2019-08-17
      • 1970-01-01
      • 2013-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多