从文档中,我了解到必须创建一个新线程
在使用前正确锚定。
为此,我想在注册表中保留对新线程的引用,
(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
这够了吗?或者我还应该用弱键/值设置一个元表?
感谢。
答案 0 :(得分:0)
完成线程后,我计划设置
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
。