Lua中的线程优先级

时间:2013-04-11 08:14:40

标签: multithreading lua thread-priority

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

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

2 个答案:

答案 0 :(得分:6)

Lua中没有本地线程(抢先式多任务处理),但是如你所说的那样有多种协作式多任务处理。

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

在协作式多任务处理中,不必有调度程序(尽管出于实际原因,通常最好有一个调度程序)。然而,有一些共同进程。协同进程就像一个线程,除了它不能被抢占。它可以运行完成,也可以屈服于另一个协同进程并允许它运行。

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

修改

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

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

协作式多任务处理也是一种非抢占式多任务处理。但是,这里的任务只是由任务本身来安排,并且控制是从任务到另一个任务明确地产生的,但它产生的任务可以基于优先级。

答案 1 :(得分:3)

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

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