3

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

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

4

2 回答 2

6

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

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

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

所以回到你的问题,如果你想要协同多任务处理的优先级,你需要编写一个调度程序,它决定运行哪个协同进程,给定它的优先级,你需要编写你的协同进程,所以他们放弃处理一次过一会儿,把控制权交还给调度器。

编辑

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

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

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

于 2013-04-11T08:28:48.213 回答
3

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

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

于 2013-04-11T08:37:34.763 回答