传递给lua_CFunctions的lua_State指针是否保证指向调用该函数的相同状态?

我正在开发一组绑定,我的许多函数都引用了“全局”Lua状态。(在我正在开发的代码中,它实际上不是全局的,而是局部于特定的运行时实例,因此所有回调函数都可以访问共享状态,所以在这个意义上是全局的。)

Lua文档似乎没有说明传递给lua_CFunction的指针是否保证是指向与用于调用函数的_exact_same_lua_State_对象的指针(直接通过lua_cpcall() 或间接通过调用调用C函数的Lua代码)。

一个小测试展示了指针引用了相同的对象,但我不知道这是否是保证的。

#include <stdio.h>
#include <lua5.1/lua.h>
#include <lua5.1/lauxlib.h>

static lua_State *state;

static int test_fn(lua_State *L)
{
    printf("global:%p local:%p\n", state, L);
    return 0;
}

int main(int argc, char const **argv)
{
    state = luaL_newstate();

    luaL_openlibs(state);
    lua_register(state, "test_fn", test_fn);

    luaL_dostring(state, "test_fn()");

    lua_close(state);
}

示例输出:

global:0x87ef008 local:0x87ef008

我知道Lua会给函数一个栈,其中仅包含该函数的参数,这让我有点不安,也许实现这个函数的方法是通过传递一个不同的状态指针来跟踪独立的栈。它还可以用许多其他方法来实现,这些方法不需要不同的lua_State--实际上,我期望它确实是以这种方式工作的--但是文档似乎没有明确说明。

这些指针是否保证相等?如果不是,可能会在什么情况下有所不同?

点赞
用户33252
用户33252

如果你的 C 函数是从 Lua 代码中调用的,那么lua_State参数将是调用 Lua 函数的 Lua 线程。

如果你的 Lua 代码不使用协程,那么只有一个线程,因此你总是会得到全局状态。

2013-07-11 18:34:46
用户1802240
用户1802240

Doug 的答案是正确的,但为了进一步阐释,当使用协程时,状态指针 不被保证 相同,而且很可能会不同。

一个此类问题的例子,请参见我几个小时前遇到的问题

2019-01-12 14:21:55