gpt4 book ai didi

c++ - 是否可以(从 C++ 中)将具有不同值的 "same"常量公开给多个 Lua 协程?

转载 作者:行者123 更新时间:2023-11-28 07:58:29 26 4
gpt4 key购买 nike

我正在编写一个名为 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)我想知道是否有是一种创建表来存储所有值并使用不那么“棘手”的解决方案返回正确值的方法。

我不习惯线程和 Lua C-api,所以我需要你的帮助。在多线程环境中可能有更好的方法来解决这个问题?

谢谢

最佳答案

如果您使用的是 Lua 5.1.x,那么您可以使用 lua_setfenv设置协同程序的环境(如 here 所述)。使用具有所需全局绑定(bind)的表,并可选择使用具有常用全局变量 _G__index 的元表。 Lua 5.1 引用手册部分描述了这种机制 2.9 Environments

Lua 5.2 中的事情有点复杂(对于这个用例);相关的引用手册部分是 2.2 – Environments and the Global Environment

关于c++ - 是否可以(从 C++ 中)将具有不同值的 "same"常量公开给多个 Lua 协程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12117559/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com