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

时间:2013-07-11 18:28:07

标签: lua lua-5.1

上下文:我正在研究一组绑定,我的许多函数都引用了“全局”Lua状态。 (我正在开发的代码中不是实际全局,而是特定运行时实例的本地,所以全局,因为所有回调函数都可以访问共享状态。)

Lua文档似乎没有指定传递给lua_CFunction的指针是否保证是指向与调用函数完全相同的lua_State对象的指针(直接通过{{ 1}}或间接通过调用调用C函数的Lua代码。)

一个小测试表明指针引用了同一个对象,但我不知道这是否有保证。

lua_cpcall()

示例输出:

#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);
}

我知道Lua为函数提供了一个只包含该函数参数的堆栈,这让我有点不安,也许这可以通过将该函数传递给跟踪独立堆栈的不同状态指针来实现。它也可以实现任何其他方式,不需要不同的global:0x87ef008 local:0x87ef008 - 实际上我希望它确实以这种方式工作 - 但文档似乎没有明确说出任何一种方式。 / p>

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

2 个答案:

答案 0 :(得分:6)

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

如果您的Lua代码不使用协同程序,则只有一个线程,因此您将始终获得全局状态。

答案 1 :(得分:0)

道格的回答是正确的,但要进一步详细说明,在使用协程时,状态指针不保证相同,并且很可能会有所不同。

有关此错误的示例,请参见the problem I was just in a few hours ago