【问题标题】:Thread priorities in LuaLua 中的线程优先级
【发布时间】:2013-04-11 08:14:40
【问题描述】:

我看了 Lua 的书,了解到 Lua 中的多线程是协作的。我找不到有关线程优先级的一些信息。我猜想具有相同优先级的线程会一直运行到完成,因为多线程是协作的,或者完成了一个yield。如果一个线程的优先级高于另一个线程呢?

它是否能够中断低优先级的线程,或者当低优先级的线程运行到完成时它会下一个运行?

【问题讨论】:

    标签: multithreading lua thread-priority


    【解决方案1】:

    Lua 中没有本机线程(抢占式多任务),但是如您所说,有协作式多任务。

    抢占式和协作式多任务之间的区别在于,在抢占式多任务中,“线程”不一定允许运行直到完成,但可以被其他线程抢占。这是由调度程序完成的,它定期运行,将一个线程切换到另一个线程。这就是优先级的用武之地。如果一个具有较高优先级的线程想要运行,它可以抢占一个已经在运行的具有较低优先级的线程,调度器将选择该线程(取决于调度策略),下次调度器运行。

    在协作式多任务处理中,不一定要有调度器(尽管出于实际原因,拥有一个调度器通常是个好主意)。然而,也有协同过程。协同进程就像一个线程,只是它不能被抢占。它可以运行到完成,也可以让给另一个协同进程并允许它运行。

    回到你的问题,如果你想要协同多任务处理的优先级,你需要编写一个调度程序,它决定运行哪个协同进程,给定它的优先级,你需要编写你的协同进程,所以他们给偶尔向上处理一次,然后将控制权交给调度程序。

    编辑

    澄清一下,非抢占式多任务处理和协作式多任务处理之间存在细微差别。非抢占式多任务处理更广泛一些,因为它允许静态调度和协作多任务处理。

    静态调度意味着调度器可以调度周期性任务,然后可以在任务产生时运行,可能具有更高的优先级。

    协作式多任务处理也是一种非抢占式多任务处理。但是,这里的任务只是由任务自己调度,并且控制权显式地从一个任务让给另一个任务,但它让给哪个任务,可以基于优先级。

    【讨论】:

    • 啊,好吧,可以这么说,所有线程都具有相同的优先级。早期版本的 Smalltalk 也具有非抢占式多任务处理,但较高优先级的线程可能会中断较低优先级的线程,这与相同优先级的线程不能相互中断不同。
    • 没有你从 pthread 中知道的“线程”,因为没有调度程序,这意味着也没有优先级的概念。这些任务是合作的,这意味着它们相互让步。
    • 感谢编辑部分的评论。 Lua 中的线程没有抢占式真是太可惜了。否则 Lua 无疑会成为我最喜欢的脚本语言。我们在使用 Smalltalk 时遇到了这样的问题,使 GUI 响应迅速。我想我会试试 Lua Lanes。不幸的是,对于需要并行运行的小东西来说,它似乎有点太重了。
    • 我过去所做的是编写一些 C 代码来处理线程(在需要时),Lua 和 C 真的很容易集成。还有一些可用于 Lua 的 pthreads-bindings,它们允许您使用线程,但要注意它们会使调试成为一场噩梦。
    【解决方案2】:

    在 Lua 中,线程不能在一个 Lua 状态下并行运行(即在多个内核上)。没有并发,因为它是协作多任务处理。只有当一个线程暂停执行(yields)时,另一个线程才能恢复。任何时候两个 Lua 线程都不能在一个 Lua 状态下同时执行。

    您所说的是抢占 - 调度程序中断一个线程以让另一个线程执行。

    【讨论】:

      猜你喜欢
      • 2011-06-25
      • 1970-01-01
      • 2012-11-17
      • 2016-06-03
      • 1970-01-01
      • 1970-01-01
      • 2014-11-26
      • 2010-09-22
      • 1970-01-01
      相关资源
      最近更新 更多