锚定一个新的Lua线程

从文档中我理解到,创建一个新的线程,必须在使用前正确地锚定它。 为了做到这一点,我想在_registry_中保留对新线程的引用,(Table[thread-addr] = thread),为此我正在这样做:

    lua_State *L = NULL;
    lua_State *L1 = NULL;
    int tref = LUA_NOREF;
    
    L = luaL_newstate(); //主要的lua线程/状态
    
    // 在注册表中创建一个表:Table[thr-addr] = Thread
    lua_newtable(L);
    tref = luaL_ref(L, LUA_REGISTRYINDEX);
    lua_pop(L, 1);
    
    L1 = lua_newthread(L);
    // 锚定它
    lua_rawgeti(L, LUA_REGISTRYINDEX, tref);
    lua_pushnumber(L, (ptrdiff_t) L1);
    lua_pushlightuserdata(L, L1);
    lua_settable(L, -3);

一旦我完成了线程,我计划将 Table[thread-addr] = nil。这就足够了吗?或者我还应该为它设置一个带有弱键/值的元表?

谢谢。

点赞
用户234175
用户234175

一旦我完成这个线程,我计划将 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

2013-06-16 23:21:26