代码之家  ›  专栏  ›  技术社区  ›  andygeers

Lua注册表在新州不可见

  •  0
  • andygeers  · 技术社区  · 17 年前

    在从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

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

    如果注册表不是以这种方式全局共享的,我如何才能像从其他脚本一样访问我的值?

    3 回复  |  直到 17 年前
        1
  •  7
  •   Javier    17 年前

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

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

        2
  •  3
  •   Kknd    17 年前

    luaL_newstate()创建另一个分离状态,正如名称所示。注册表仅在使用lua_newthread(父线程状态)创建的“线程”之间共享;

    编辑以匹配问题编辑:

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

        3
  •  2
  •   akauppi    17 年前

    Lua Lanes comparison 多状态Lua解决方案。