Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading LuaLanes无法在函数之间传递全局变量(在单个通道中)_Multithreading_Lua_Lua Lanes - Fatal编程技术网

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

Multithreading LuaLanes无法在函数之间传递全局变量(在单个通道中),multithreading,lua,lua-lanes,Multithreading,Lua,Lua Lanes,希望你今天过得愉快 在过去的几天里,我一直在用Lua编写一个IRC聊天机器人,最后我想开始在其中实现多服务器支持 到目前为止,我已经创建了irc“对象”来管理每台服务器,以及所有令人高兴的事情——现在,我在线程方面遇到了问题 您可能知道,Lua没有内置线程支持。就图书馆而言,LuaLanes和LuaThreads似乎最接近我想要使用的东西。我之所以选择LuaLanes是因为LuaThreads需要一个经过修改的lua核心。加上LuaLanes的“lindas”特性吸引了我的眼球(供以后在插件中使

希望你今天过得愉快

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

到目前为止,我已经创建了irc“对象”来管理每台服务器,以及所有令人高兴的事情——现在,我在线程方面遇到了问题

您可能知道,Lua没有内置线程支持。就图书馆而言,LuaLanes和LuaThreads似乎最接近我想要使用的东西。我之所以选择LuaLanes是因为LuaThreads需要一个经过修改的lua核心。加上LuaLanes的“lindas”特性吸引了我的眼球(供以后在插件中使用)

无论如何,我遇到的问题是,当您使用函数
middleman
(例如)生成一条车道时,它会调用另一个函数
sqr
(例如)。如果您生成像
lanes.gen({globals=\G},middleman)
这样的函数,middleman将能够访问您当前全局范围内的所有内容,这正是我想要的。问题是,如果
middleman
调用
sqr
,并且
sqr
使用全局范围内的内容,它会抛出一个错误,就像
\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:~$ 
tc@box:~$lua lanestrouble.lua
lua:lanestrouble.lua:4:尝试调用全局“print”(一个nil值)
堆栈回溯:
[C] :在函数“error”中
/车道。lua:190:功能正常
lua:13:在主块中
[C] :?
threading.c 399:pthread_cond_destroy(ref)失败,16 EBUSY
流产
tc@box:~$ 
(顺便说一下,我正在使用linux)

但是,如果您将第11行从
gen=lanes.gen({globals=\u G},middleman)
更改为
gen=lanes.gen({globals=\u G},sqr)
,则效果良好

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

我真希望有类似Java的Lua线程库的东西,这就是我最初学习使用线程的方式。(我知道,我想这不是最理想的环境)


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

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”传递到新车道时,它也不会看到“print”(当被称为“sqr”时)。在我看来,在车道之间序列化函数时,某些功能似乎不正常。您应该联系its。

\o/非常感谢!非常感谢。诚然,将所有内容都本地化,但仍然可用,这将是一种轻微的痛苦,但知道一种解决方法很好。(我说了谢谢吗?)