我怎样才能将全局或环境从主要状态变为Lua通道?

时间:2012-04-15 09:09:15

标签: c multithreading api lua lua-lanes

local lanes = require "lanes".configure()
local linda = lanes.linda()
local thread = lanes.gen({globals = _G}, function()
print("Starting thread...")
while true do
    local command = linda:receive("cmd")
    if command=="quit" then
        break
    else
        broadcast(-1,"Hello from lanes.")
    end
end
end)

local threads = {}
local NCORES = 2
for i=1,NCORES do threads[i] = thread() end
linda:send("cmd", "test")
for i=1,NCORES do linda:send("cmd", "quit") end
for i=1,NCORES do threads[i]:join() end

作为对我的游戏服务器进行测试以使Lua Lanes正常运行,我试图在新线程中使用来自主状态的全局函数。不幸的是,这个特定代码会导致Assert Failure in tools.c line 1216。我正在尝试设置它,这样我就可以在没有锁定主线程的情况下进行繁忙的工作,最终我的游戏服务器。或许有更好的方法吗?或者也许我可以通过我的服务器中的luaL_newthread(state)运行我的脚本?请告诉我正确的方向,因为这目前正在阻止我的发展。提前谢谢。

1 个答案:

答案 0 :(得分:0)

你不应该像在车道上那样访问全局变量。线程以单独的状态运行。你得到的是全局表的深层副本(不是参考)。此外,通过在单独的线程中调用全局函数,您可能会面临同步问题。

您可以做的是require线程本身的模块。要将broadcast函数放入线程,您可以选择以下选项:

  1. broadcast和其他功能放入模块中,并在主题中调用require
  2. 在线程函数之前将broadcast存储为local以将其作为upvalue。
  3. 更新:遗憾的是,第二种方式不再像过去那样有效了。由于与LuaJIT 2的兼容性问题,Lanes必须在configure运行时compute a mapping table of native functions。我没有找到一种方法将一个简单的C函数转移到线程中,而不是实际require线程中的模块。