0

在从我的 Lua 脚本调用的 C 函数中,我luaL_ref用来存储对函数的引用。但是,如果我随后尝试使用返回的整数索引从不是从同一状态派生的不同线程获取该函数,我得到的只是nil. 这是似乎可以证明这一点的最简单示例:

// Assumes a valid lua_State pL, with a function on top of the stack
int nFunctionRef = luaL_ref(pL, LUA_REGISTRYINDEX);

// Create a new state
lua_State* pL2 = luaL_newstate();
lua_rawgeti(pL2, LUA_REGISTRYINDEX, nFunctionRef);
const char* szType = luaL_typename(pL2, -1);

我发现它szType包含值'nil'。

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

如果注册表不是以这种方式全局共享的,我怎样才能像我需要的那样从另一个脚本访问我的值?

4

3 回答 3

7

注册表只是一个 Lua 状态下的普通表,因此两个不相关的 Lua 状态不能访问同一个注册表。

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

复制函数特别困难,如果您为此使用注册表,您可能希望跟踪您用于存储它的状态,并在原始状态上执行它,从而有效地将其转换为跨状态调用,而不是的移动功能。

于 2009-04-06T04:14:49.830 回答
3

luaL_newstate() 顾名思义,创建另一个分离状态。注册表仅在“线程”之间共享,使用 lua_newthread(parent_state); 创建

编辑以匹配问题编辑:

您可以在相同的状态下运行脚本,或者,如果您不希望这样,您将需要提供自己的机制来同步两种状态之间的数据。

于 2009-04-06T01:06:44.710 回答
2

要使用多个 Lua 宇宙(状态),您可能会发现Lua Lanes值得一看。还有一个多态 Lua 解决方案的粗略比较。

Lanes 实际上确实提供了 Javier 提到的“隐藏状态”。它还处理访问此类共享数据所需的锁以及等待此类数据更改的能力。它会在您的应用程序状态和隐藏状态之间复制任何可复制的内容(包括函数和闭包)。

于 2009-04-06T15:29:58.270 回答