新状态下无法查看 Lua 注册表。

在我的 Lua 脚本中调用 C 函数时,我使用 luaL_ref 将对函数的引用存储到了一个整数索引中。然而,在我尝试从不派生自相同状态的其他线程中使用返回的整数索引获取该函数时,我得到的只是 nil。以下是似乎证明这一点的最简单的示例:

// 假设有一个有效的 lua_State pL,栈顶上有一个函数
int nFunctionRef = luaL_ref(pL, LUA_REGISTRYINDEX);

// 创建一个新状态
lua_State* pL2 = luaL_newstate();
lua_rawgeti(pL2, LUA_REGISTRYINDEX, nFunctionRef);
const char* szType = luaL_typename(pL2, -1);

我发现此时 szType 包含的值为 "nil"。

我的理解是,注册表在所有的 C 代码之间是全局共享的,所以有没有人可以解释一下为什么这不起作用呢?

如果注册表不是以这种方式全局共享的,我该如何从另一个脚本中访问我的值?

点赞
用户18403
用户18403

luaL_newstate() 创建了另一个独立的状态,就像它的名字一样。注册表只在使用 lua_newthread(parent_state) 创建的“线程”之间共享。

要答复问题,您可以在同一个状态中运行脚本,或者如果您不想这样,您需要提供自己的机制来在两个状态之间同步数据。

2009-04-06 01:06:44
用户11649
用户11649
注册表只是 Lua 状态中的一个普通表格,因此两个不相关的 Lua 状态无法访问同一个注册表。

正如 Kknd 所说,您必须提供自己的机制。一个常见的技巧是创建一个额外的状态,它不执行任何代码,只用作存储。在您的情况下,您将从您的 C 代码中使用该额外状态的注册表。不幸的是,没有可用的方法来在两个状态之间复制任意值,因此您将不得不展开任何表。

复制函数尤其困难,如果您正在使用注册表来做这件事,您可能想要跟踪您用于存储它的状态,并在原始状态上执行它,从而将其转换为跨状态调用,而不是移动函数。
2009-04-06 04:14:49
用户14455
用户14455

如果你想使用多个Lua宇宙(状态),你可能会发现Lua Lanes值得一看。这里也有一个粗略的比较多状态Lua解决方案的网页。

实际上,Lanes提供了Javier提到的“隐藏状态”。它还处理访问这种共享数据所需的锁定以及等待这种数据发生变化的能力。它还将可复制的任何东西(包括函数和闭包)在应用程序状态和隐藏状态之间复制。

2009-04-06 15:29:58