0
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)在我的服务器中运行我的脚本?请告诉我正确的方向,因为这目前正在停止我的发展。提前致谢。

4

1 回答 1

0

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

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

  1. broadcast其他函数放入一个模块并require在线程中调用。
  2. 存储broadcastlocal线程函数之前的 a 以将其作为上值。

更新:不幸的是,第二种方式不再像以前那样工作了。由于与 LuaJIT 2 的兼容性问题,Lanes 必须在运行时计算原生函数的映射表configure。我还没有找到一种将简单的 C 函数转移到线程中的方法,而不是真正require将模块转移到线程中。

于 2012-04-15T12:31:01.597 回答