在C++中,是否有可能将“相同”的常量以不同的值暴露给多个Lua协程?
我正在编写一个名为LuaVM的库,用于管理Lua脚本与我的项目之间的交互,使用Lua库。
我正在寻找一种方法来揭示“本地”协程变量。因此,我可以使用相同的“变量名称”从不同的协程访问不同的值。但是,您可能知道协程与其lua_State父项共享相同的全局环境,以及它们从同一个lua_State发出的所有其他协程。
例如,我想向每个协程公开“thisItem”全局变量,以便每个脚本(每个脚本都有自己的协程)都可以调用“thisItem”,并获得不同的值,即使它们使用相同的lua_State父项并且嵌套。
因此,我尝试了不同的方法,例如使用堆栈公开/未公开值,但没有一个是“线程”证明的。
我的最后一次尝试是将全局“thisItem”与元表关联,其中“__index”和/或“__call”键被修改为调用一个函数,该函数尝试返回正确的值。
以下是如何公开它
//-- 定义回调函数 int LuaVM::DEBUGFUNCTION(lua_State * L) { //-- Do stuff to return the right value return 1; }
//-- 在构造函数中创建回调元表 LuaVM::LuaVM() { //--Init Lua mState = luaL_newstate(); luaL_openlibs(mState); /* etc...*/
//-- 定义回调元表
luaL_newmetatable(mState, "ThreadLocalMT");
lua_pushstring(mState, "__call");
lua_pushcclosure(mState, DEBUGFUNCTION, 0);
lua_settable(mState, -3);
}
//-- 然后定义exposeInstance函数
template
luaL_getmetatable(mState, "ThreadLocalMT");
lua_setmetatable(mState, -2);
lua_setglobal(mState, "thisItem");
/* other stuff */
return true;
}
但这不是我正在寻找的真正解决方法...(我需要调用“ thisItem()”而不是变量“ thisItem”),我想知道是否有一种方法创建一个表来存储所有值并使用较少“巧妙”的解决方案返回正确的值。
我不熟悉线程,也不熟悉Lua C-api,因此需要您的帮助。 在多线程环境下管理此问题可能有更好的方法?
谢谢
- 如何将两个不同的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中获取用户配置主目录的跨平台方法
如果你使用的是 Lua 5.1.x 版本,则可以使用
lua_setfenv方法来设置协程的环境(详见这里)。使用一个包含全局变量的表,以及一个可选的元表,带有一个普通全局变量_G的__index。这个机制在 Lua 5.1 参考手册的 2.9 环境 章节中有描述。在 Lua 5.2 中,事情会更加复杂一些(对于这个使用场景来说)。相关的参考手册章节是 2.2 环境和全局环境。