0

我正在编写一个名为 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,所以我需要你的帮助。在多线程环境中可能有更好的方法来管理这个问题?

谢谢

4

1 回答 1

1

如果您使用的是 Lua 5.1.x,那么您可以使用来设置协程的环境(如此lua_setfenv所述)。使用带有您想要的全局绑定的表,并且可以选择使用带有通常 globals的元表。Lua 5.1 参考手册第2.9 节环境中描述了这种机制__index_G

Lua 5.2 中的事情有点复杂(对于这个用例);相关参考手册部分是2.2 – 环境和全球环境

于 2012-08-24T23:03:35.150 回答