【问题标题】:Lua C - Is there a way to keep a value in C, but still have it not garbage collected?Lua C - 有没有办法在 C 中保留一个值,但仍然没有垃圾收集?
【发布时间】:2021-06-22 17:02:32
【问题描述】:

我正在 lua c 中创建一个线程,但我想将其保留在 C 中,而不是使其成为环境/等中的变量。但是当我丢弃由 lua_newthread 推送的线程值时,它很快就会被垃圾收集,因此变得无用。 在这个线程中,我想运行用户传递的任意 lua 代码,允许他们使用与其他线程隔离的专有函数/变量。

有没有办法将线程/用户数据/表值标记为不可垃圾回收?

【问题讨论】:

    标签: lua luac lua-c++-connection


    【解决方案1】:

    不,您必须在某处引用它或禁用 GC。 使用lua_ref 来引用大部分隐藏的地方:注册表。 (debug.getregistry())

    【讨论】:

    • 虽然这是一个很好的答案,在许多情况下都可以使用 - 它可能不适合我...我希望其他线程也可以通过 debug.getregistry 访问注册表。
    • 你的意思是类协程线程还是独立的lua状态?
    • lua_newthread。不是单独的全局状态,而是单独的 lua 状态。这就是协程内部使用的,所以是的,类似协程的线程。如果我不使用 lualanes 或其他东西,我几乎不可能拥有不同的全局状态。
    【解决方案2】:

    这是可能的。 您可以使用 TValue 的 gcobj 作为参数添加对 gc_mark 的调用到 gc_markroots。

    【讨论】:

      猜你喜欢
      • 2012-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      • 2011-10-12
      相关资源
      最近更新 更多