代码之家  ›  专栏  ›  技术社区  ›  RCIX

Lua中的多线程

  •  9
  • RCIX  · 技术社区  · 14 年前

    前几天我和朋友讨论过。我说的是,在纯Lua中,你不能构建一个抢先的多任务系统。他声称你可以,原因如下:

    C和Lua都没有内置的线程库[Op'sNote:嗯,Lua在技术上是这样的,但是Afaik对于我们的目的来说并不有用]。Windows主要是用C(++)编写的,它具有先发制人的多任务处理功能,它们是从零开始构建的。因此,您应该能够在Lua中做到这一点。 我看到的一个大问题是,抢占式多任务工作(据我所知)的主要方式是,它生成定期中断,管理器使用这些中断来获得控制权,并确定下一步应该处理什么代码。我也不认为Lua有任何可以做到这一点的设施。

    我的问题是: 有没有可能写一个纯粹的Lua库,让人们可以先发制人的多任务处理?

    3 回复  |  直到 14 年前
        1
  •  7
  •   Norman Ramsey    14 年前

    我不知道该怎么做,尽管没有正式的Lua语义(就像 yield 例如),很难提出一个铁证如山的论点,为什么不能做到这一点。(我一直想要一个正式的语义 时代 但显然罗伯托和拉弗有更好的事情要做。)

    如果我想要Lua的先发制人的多任务处理,我甚至不会尝试在纯Lua中进行。相反,我使用的是20年前在新泽西标准ML中第一次看到的一个老技巧:

    • 中断在 lua_State 说“现在的协同行动已经被抢先了”。

    • 更改vm,以便在每个循环和每个函数调用上,它检查标志并在必要时生成。

    这个补丁易于编写和维护。它并不能解决长时间运行的C函数不能先发制人的问题,但是如果你必须解决这个问题,你将进入一个更困难的领域,你也可以在C级别完成所有线程,而不是在Lua级别。

        2
  •  5
  •   Twisol    14 年前

    不是我所知道的,不是。如果您可以使用debug.sethook从coroutines上设置的钩子中让步,这几乎是荒谬的简单,但是它不起作用。你 可以 从C(Lua_sethook)设置的C钩子获得收益,但我不知道 确切地 要做到这一点,无论如何也不是纯粹的Lua。

    即使可能,也不会是真正的线程。例如,所有操作系统都将在同一个操作系统线程中运行。你的钩子会考虑各种因素(比如时间,也许记忆等),然后决定是否屈服。屈从于共同行动的人会决定下一个行动的是哪个孩子。您还需要决定何时调用钩子。最常见的是每个lua指令,但这会带来性能损失。如果协程调用了C函数,Lua就没有管辖权。如果这个电话要花很长时间,你就无能为力了。

    Here 这是Lua-L邮件列表中的一个相关线程,您可能会发现它很有趣。

        3
  •  5
  •   Jeffrey Harper    13 年前

    不,不能用纯Lua编写抢占式调度程序。在某种程度上,抢占式调度程序需要一些机制,比如中断服务例程,来从当前线程获取控制权,并将其交给调度程序,然后调度程序再将其交给另一个线程。纯Lua没有这种机制。

    你提到Windows主要是用C/C++编写的。关键字主要是。不能在纯ANSI C/C++中编写抢占式调度程序。通常,中断服务程序的一部分是用汇编语言编写的。或者,C/C++编译器实现非标准扩展,允许中断服务例程用C/C++编写。有些编译器允许您声明带有中断修饰符的函数,该修饰符使编译器生成一个延长/epilog,该修饰符允许函数用作中断服务例程。

    此外,设置中断服务程序的代码使用内存映射IO或IO指令的CPU寄存器。这些代码都不是便携式的ANSI C/C++。而且,取决于CPU架构。