传递给lua_CFunctions的lua_State指针是否保证指向调用该函数的相同状态?
2013-7-11 18:34:53
收藏:0
阅读:100
评论:2
我正在开发一组绑定,我的许多函数都引用了“全局”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--实际上,我期望它确实是以这种方式工作的--但是文档似乎没有明确说明。
这些指针是否保证相等?如果不是,可能会在什么情况下有所不同?
点赞
用户1802240
Doug 的答案是正确的,但为了进一步阐释,当使用协程时,状态指针 不被保证 相同,而且很可能会不同。
一个此类问题的例子,请参见我几个小时前遇到的问题。
2019-01-12 14:21:55
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
如果你的 C 函数是从 Lua 代码中调用的,那么
lua_State参数将是调用 Lua 函数的 Lua 线程。如果你的 Lua 代码不使用协程,那么只有一个线程,因此你总是会得到全局状态。