Lua Lanes报‘Recursive use of upvalues’错误的原因探究
问题原因解析
- 核心差异在于upvalue的引用类型与Lua Lanes的递归复制逻辑:
- 直接使用
M.test时,M是M.laneFunc的upvalue。Lua Lanes创建子线程时,需要复制函数依赖的所有upvalue到新线程环境。M作为表,内部包含M.linda(Lanes的linda对象)和M.laneFunc本身,形成循环引用:M.laneFunc依赖M,M又包含M.laneFunc。Lanes递归复制该表时检测到这种循环依赖,抛出Recursive use of upvalues; cannot copy the function错误。 - 赋值给局部变量
ts后,ts存储的是字符串"blabla"的直接副本,作为upvalue时只是简单基础类型,不涉及对M表的引用,不会触发递归复制的循环问题,因此能正常运行。
- 直接使用
验证代码
local lanes = require "lanes" local M = {} M.linda = lanes.linda() M.test = "blabla" local ts = M.test function M.laneFunc(linda, i, n) -- print(M.test .. "Starting thread "..i.." with "..n.." seconds wait") -- 触发错误 print(ts .. "Starting thread "..i.." with "..n.." seconds wait") -- 正常运行 end local function CreateLane() local thread = lanes.gen("*", M.laneFunc) return thread(M.linda, 1, 1) end local t = CreateLane() return M
内容的提问来源于stack exchange,提问作者po.pe
相关产品推荐
相关产品推荐

