在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 bool LuaVM::exposeInstance(C*_ptr,/other stuff/) { LuaObject* ret = (LuaObject*)lua_newuserdata(mState, sizeof(LuaObject)); ret->ptr = _ptr;

luaL_getmetatable(mState, "ThreadLocalMT");
lua_setmetatable(mState, -2);
lua_setglobal(mState, "thisItem");

/* other stuff */
return true;

}

但这不是我正在寻找的真正解决方法...(我需要调用“ thisItem()”而不是变量“ thisItem”),我想知道是否有一种方法创建一个表来存储所有值并使用较少“巧妙”的解决方案返回正确的值。

我不熟悉线程,也不熟悉Lua C-api,因此需要您的帮助。 在多线程环境下管理此问题可能有更好的方法?

谢谢

点赞
用户33252
用户33252

如果你使用的是 Lua 5.1.x 版本,则可以使用 lua_setfenv 方法来设置协程的环境(详见这里)。使用一个包含全局变量的表,以及一个可选的元表,带有一个普通全局变量 _G__index。这个机制在 Lua 5.1 参考手册的 2.9 环境 章节中有描述。

在 Lua 5.2 中,事情会更加复杂一些(对于这个使用场景来说)。相关的参考手册章节是 2.2 环境和全局环境

2012-08-24 23:03:35