4

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

Lua 文档似乎没有指定传递给 a 的指针lua_CFunction是否保证是指向与调用函数完全相同的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——事实上我希望它确实以这种方式工作——但文档似乎并没有明确说明任何一种方式。

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

4

2 回答 2

6

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

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

于 2013-07-11T18:34:46.713 回答
0

Doug 的回答是正确的,但更详细地说,当您使用协程时,状态指针不能保证是相同的,并且很可能会有所不同。

有关此错误的示例,请参阅我几个小时前遇到的问题

于 2019-01-12T14:21:55.830 回答