c - 如何将全局变量或环境从主状态转移到 Lua channel ?

标签 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 正常运行,我尝试在新线程中使用主状态中的全局函数。不幸的是,这个特定的代码一直导致 tools.c 第 1216 行中的断言失败。我正在尝试进行设置,以便我可以在不锁定主线程以及最终我的游戏服务器的情况下完成繁忙的工作。也许有更好的方法来做到这一点吗?或者也许我可以通过服务器中的 luaL_newthread(state) 运行我的脚本?请告诉我正确的方向,因为这目前阻碍了我的发展。提前致谢。

最佳答案

你不应该在 channel 中访问这样的全局变量。线程以单独的状态运行。您得到的是全局表的深拷贝(不是引用)。此外,通过在单独的线程中调用全局函数,您还面临同步问题的风险。

您可以做的是在线程本身中require一个模块。要将广播函数放入线程中,您有以下选项:

  1. broadcast等函数放入模块中,并在线程中调用require
  2. 在线程函数之前将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/

相关文章:

c++ - 使用按位运算符检查数字是正数还是负数

c++ - 如何在 C/C++ 中编写一个简单的整数循环缓冲区?

python - 是否可以在类中线程化子类?

api - Rails 5 仅限 api 的应用程序,带有主页

android - 在哪里可以阅读有关 Android 新 API 和弃用 API 列表的信息

c - IP 的正则表达式 c 部分

c - 在C中,如何将 float 或 double 除以2的i次方?

java - 杀死所有线程后退出 Activity android

python - 创建聊天(客户端)程序。如何添加同时对话?

java - 当前平台不支持桌面 API