锚定一个新的Lua线程

  • 本文关键字:Lua 线程 一个 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这足够吗?或者我还应该为它设置一个元表,带有弱键/值?

谢谢。

一旦我完成了线程,我计划设置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代替。

最新更新