锚定一个新的Lua线程

时间:2013-06-16 15:46:51

标签: c lua

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

感谢。

1 个答案:

答案 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