我正在编写一个名为 LuaVM 的库来管理 Lua 脚本和我自己使用 Lua 库的项目之间的交互。
我正在寻找一种方法来公开一些“本地”协程变量。所以我可以使用相同的“变量名”从不同的协程访问不同的值。但是你可能知道协程与其 lua_State 父级共享相同的全局环境,以及从相同 lua_State 发出的所有其他协程。
例如,我想将thisItem
全局暴露给每个协程,以便每个脚本(每个脚本都有自己的协程)可以调用thisItem
并获得不同的值,即使它们使用相同的 lua_State 父级并且是嵌套的。
所以我尝试了不同的方法,例如使用堆栈公开/取消公开值,但没有一个确实是“线程”证明。
我的最后一次尝试是将全局thisItem
与一个元表关联,其中__index
和/或__call
键被修改以调用一个函数,该函数又试图返回正确的值。
这是我公开它的方式
//-- Define a callback function
int LuaVM::DEBUGFUNCTION(lua_State *L)
{
//-- Do stuff to return the right value
return 1;
}
//-- Create callback metatable in the constructor
LuaVM::LuaVM()
{
//--Init Lua
mState = luaL_newstate();
luaL_openlibs(mState);
/* etc...*/
//-- Define the callback metatable
luaL_newmetatable(mState, "ThreadLocalMT");
lua_pushstring(mState, "__call");
lua_pushcclosure(mState, DEBUGFUNCTION,0);
lua_settable(mState, -3);
}
//-- Then define the exposeInstance function
template <class C>
bool LuaVM::exposeInstance(C* _ptr, /*other stuff*/ )
{
LuaObject<C>* ret = (LuaObject<C>*)lua_newuserdata(mState, sizeof(LuaObject<C>));
ret->ptr = _ptr;
luaL_getmetatable(mState, "ThreadLocalMT");
lua_setmetatable(mState, -2);
lua_setglobal(mState,"thisItem");
/* other stuff */
return true;
}
但这并不是我真正想要的......(我需要调用thisItem()
而不是变量thisItem
)并且我想知道是否有一种方法可以创建一个表来存储所有值并使用 less “返回正确的值棘手”的解决方案。
我不习惯线程和 Lua C-api,所以我需要你的帮助。在多线程环境中可能有更好的方法来管理这个问题?
谢谢