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 正常运行,我尝试在新线程中使用主状态中的全局函数。不幸的是,这个特定的代码一直导致 tools.c 第 1216 行中的断言失败
。我正在尝试进行设置,以便我可以在不锁定主线程以及最终我的游戏服务器的情况下完成繁忙的工作。也许有更好的方法来做到这一点吗?或者也许我可以通过服务器中的 luaL_newthread(state) 运行我的脚本?请告诉我正确的方向,因为这目前阻碍了我的发展。提前致谢。
最佳答案
你不应该在 channel 中访问这样的全局变量。线程以单独的状态运行。您得到的是全局表的深拷贝(不是引用)。此外,通过在单独的线程中调用全局函数,您还面临同步问题的风险。
您可以做的是在线程本身中require
一个模块。要将广播
函数放入线程中,您有以下选项:
- 将
broadcast
等函数放入模块中,并在线程中调用require
。 在线程函数之前将broadcast
存储为local
,以将其作为upvalue获取。
更新:不幸的是,第二种方法不再像以前那样有效。由于与 LuaJIT 2 的兼容性问题,Lanes 必须 compute a mapping table of native functions在运行 configure
时。除了实际 require
线程中的模块之外,我还没有找到一种将简单的 C 函数传输到线程中的方法。
关于c - 如何将全局变量或环境从主状态转移到 Lua channel ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10160793/