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 是否足够?或者我也应该为它设置一个元表,带有弱键/值?

谢谢。

4

1 回答 1

3

完成线程后,我计划设置这Table[thread-addr] = nil是否足够?或者我也应该为它设置一个元表,带有弱键/值?

如果您不希望它引用的对象被视为真正的“强”引用,则使用弱表。GC因此,即使弱表仍然引用该对象,如果没有其他对它的引用,Lua 也可以访问该对象。

从您描述的用例来看,Tableweak 在这里可能不合适,因为 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 指针。如果您告诉 Lua 将协程对象视为 C 数据指针,协程对象的生命周期将无法正确管理。为此,您可能打算lua_pushthread改用它。

于 2013-06-16T23:21:26.223 回答