LuaLanes无法在函数之间传递全局变量(在单个通道中)

时间:2011-05-30 19:12:49

标签: multithreading lua lua-lanes

希望你过得愉快。

过去几天我一直在Lua编写一个IRC聊天机器人,最后我想开始在其中实现多个服务器支持。

到目前为止,我已经创建了irc“对象”来管理每个服务器,以及所有那些快乐的东西 - 现在,我遇到了线程问题。

你可能知道,Lua没有内置的线程支持。就图书馆而言,LuaLanes和LuaThreads似乎最接近我想要使用的东西。是什么让我选择LuaLanes是因为LuaThreads需要一个修改过的lua核心。此外,LuaLanes的“lindas”功能引起了我的注意(以后在插件中使用)

无论如何,我遇到的问题是当你使用函数middleman生成一个通道时(例如),然后调用另一个函数sqr(例如)。如果你生成像lanes.gen({globals = _G}, middleman)这样的函数,midman将可以访问当前全局范围内的所有内容,这正是我想要的。问题是,如果middleman调用sqrsqr使用全局范围内的内容,则会抛出错误,几乎就像_G突然变空一样。

以下是我设法将一起放在一起的示例代码,使用上面的示例:

require 'lanes'

function sqr()
    print(5*5)
end

function middleman()
    sqr()
end

gen = lanes.gen({globals = _G}, middleman)

print(gen()[1])

产生错误说:

tc@box:~$ lua lanestrouble.lua 
lua: lanestrouble.lua:4: attempt to call global 'print' (a nil value)
stack traceback:
        [C]: in function 'error'
        ./lanes.lua:190: in function <./lanes.lua:136>
        lanestrouble.lua:13: in main chunk
        [C]: ?
threading.c 399: pthread_cond_destroy(ref) failed, 16 EBUSY
Aborted
tc@box:~$ 

(顺便说一下,我正在使用linux)

但是,如果您将第11行从gen = lanes.gen({globals = _G}, middleman)更改为gen = lanes.gen({globals = _G}, sqr),则可以正常使用。

我已经检查了,如果您传递“*”(或“libs_str”参数的任何其他选项)来加载默认库,也会发生同样的事情。

我真的希望有一些像Lua的Java线程库,这就是我最初学会使用线程的方式。 (我知道,不是我认为最理想的环境)

谢谢,我非常感谢你的帮助。特别是因为这已经完全停止了我的IRC bot开发! :(

1 个答案:

答案 0 :(得分:3)

sqr本地化就可以了。由于它成为中间人的升值,它被复制到新的车道。

require 'lanes'

local function sqr()
    print(5*5)
end

function middleman()
    sqr()
end

gen = lanes.gen({globals = _G}, middleman)

print(gen()[1])

但绝对有些奇怪的事情正在发生。我的意思是,即使明确地将“sqr”和“print”传递给新车道,它也不会看到“打印”(当被“sqr”调用时)。在我看来,当在通道之间序列化函数时,某些东西不能正常工作。您应该联系maintainer