Lua ライブラリを使用して、Lua スクリプトと自分のプロジェクトとの間のやり取りを管理するために、LuaVM というライブラリを作成しています。
やや「ローカル」なコルーチン変数を公開する方法を探しています。したがって、同じ「変数名」を使用して、異なるコルーチンから異なる値にアクセスできます。しかし、ご存じのとおり、コルーチンは lua_State の親と同じグローバル環境を共有し、同じ lua_State から発行された他のすべてのコルーチンを共有します。
たとえば、グローバルを各コルーチンに公開して、同じ lua_State 親を使用していてネストされている場合でも、thisItem
各スクリプト (それぞれ独自のコルーチンを持つ) が呼び出して異なる値を取得できるようにしたいと考えています。thisItem
そのため、スタックを使用して値を公開/公開解除するなど、さまざまなアプローチを試みましたが、実際には「スレッド」の証拠はありませんでした。
私の最後の試みは、適切な値を返そうとする関数を呼び出すために、および/またはキーが変更され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 にも慣れていないので、あなたの助けが必要です。マルチスレッド環境でこの問題を管理するためのより良い方法はありますか?
ありがとうございました