从文档中,我理解创建一个新线程,必须是使用前正确锚定。要做到这一点,我想在注册表中保留对新线程的引用,(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
这足够吗?或者我还应该为它设置一个元表,带有弱键/值?
谢谢。
一旦我完成了线程,我计划设置
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指针。如果你告诉Lua把协程对象当作C数据指针来对待,那么Lua就不能正确地管理协程对象的生命周期。对于此,您可能打算使用lua_pushthread
代替。