アイデアはかなり単純です。まず、新しいスレッドを作成します。
lua_State *pThread = lua_newthread(L);
この関数は、そのスレッドをにプッシュしますL
。次のステップは、スレッド関数をに取得することpThread
です。この時点でスタックにLua関数があるとすると、次のステップはその関数をpThread
スタックに転送することです。
スレッド間で値を転送するための特別な関数がありますlua_xmove
。ただし、スタックの最上位の要素のみを転送します。L
したがって、Lua関数をスタック上の場所からスタックの一番上にコピーする必要がありL
ます。次にlua_xmove
、新しいスタックに移動します。
lua_pushvalue(L, #); //Where # is the index in the stack where the function is.
//Remember that lua_newthread pushed a value on the stack, so compensate for that.
lua_xmove(L, pThread, 1); //Moves the function to the top of the new stack.
lua_xmove
値を移動し、から削除することを忘れないでくださいL
。したがってlua_pushvalue
、値をプッシュしてlua_xmove
ポップします。したがって、スタックの最上位は再び。でlua_State
表されpThread
ます。
その後、関数に送信する必要のあるすべてのパラメーター(明らかにゼロ)をプッシュして、再開します。
lua_resume(pThread, 0, 0);
合計コード:
lua_State *pThread = lua_newthread(L);
lua_pushvalue(L, #); //Where # is the index in the stack where the function is.
//Remember that lua_newthread pushed a value on the stack, so compensate for that.
lua_xmove(L, pThread, 1); //Moves the function to the top of the new stack.
lua_resume(pThread, 0, 0);
Luaスレッド(Luaで作成されたかC APIで作成されたかに関係なく)は、テーブル、ユーザーデータ、文字列などと同様にLua値です。したがって、ガベージコレクションの対象になります。Luaが値への参照がなくなったことを検出すると収集されます。
注意:lua_newthread
スレッドを元のスタックにプッシュします。それをレジストリ、グローバル環境、またはそのスレッドを永続的に存在させる予定の場所にコピーするのはあなた次第です。lua_State
生成されたポインタへのポインタを保持するだけでは、スレッドが存続することは保証されません。