0

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 にも慣れていないので、あなたの助けが必要です。マルチスレッド環境でこの問題を管理するためのより良い方法はありますか?

ありがとうございました

4

1 に答える 1

1

Lua 5.1.x を使用している場合lua_setfenvは、コルーチンの環境を設定するために使用できます (ここで説明されているように)。必要なグローバルバインディングを持つテーブルを使用し、オプションで__index通常のグローバルのメタテーブルを使用します_G。このメカニズムは、Lua 5.1 リファレンス マニュアルのセクション2.9 環境で説明されています。

Lua 5.2 では、(このユースケースでは) もう少し複雑です。関連するリファレンス マニュアルのセクションは2.2 – 環境とグローバル環境です。

于 2012-08-24T23:03:35.150 に答える