3

ドキュメントから、作成された新しいスレッドは、使用前に適切に固定する必要があることを理解しています。そのために、レジストリに新しいスレッドへの参照を保持したい( Table[thread-addr] = thread) そのために、次のようにしています。

lua_State *L = NULL;
lua_State *L1 = NULL;
int tref = LUA_NOREF;

L = luaL_newstate(); // main lua thread/state

// create a table in registry: Table[thr-addr] = Thread
lua_newtable(L);
tref = luaL_ref(L, LUA_REGISTRYINDEX);
lua_pop(L, 1); 

L1 = lua_newthread(L);
// Anchor it
lua_rawgeti(L, LUA_REGISTRYINDEX, tref);
lua_pushnumber(L, (ptrdiff_t) L1);
lua_pushlightuserdata(L, L1);
lua_settable(L, -3);

スレッドの処理が完了したら、Table[thread-addr] = nil Is this enough ?を設定する予定です。または、弱いキー/値を使用して、メタテーブルも設定する必要がありますか?

ありがとう。

4

1 に答える 1

3

スレッドの処理が完了したら、[Table[thread-addr] = nilこれで十分ですか?]を設定する予定です。または、弱いキー/値を使用してメタテーブルを設定する必要がありますか?

弱いテーブルは、それが参照するオブジェクトを実際の「強い」参照としてカウントしたくない場合に使用されます。したがって、弱いテーブルがまだそのオブジェクトを参照している場合でも、そのオブジェクトへの他の参照がない場合、Lua はGCそのオブジェクトに許可されます。

あなたが説明したユースケースからTable、Luaはそれを使用する前にそのコルーチンオブジェクトを収集する可能性があるため、弱体化はおそらくここでは適切ではありません.

また、ここにあなたのサンプルコード:

L1 = lua_newthread(L);
// Anchor it
lua_rawgeti(L, LUA_REGISTRYINDEX, tref);
lua_pushnumber(L, (ptrdiff_t) L1);
lua_pushlightuserdata(L, L1);
lua_settable(L, -3);

このlua_pushlightuserdata関数は C ポインター用です。コルーチン オブジェクトを C データ ポインターのように扱うように指示すると、コルーチン オブジェクトの有効期間が Lua によって正しく管理されません。このために、おそらくlua_pushthread代わりに使用するつもりでした。

于 2013-06-16T23:21:26.223 に答える