我看过Lua的书,了解到Lua中的多线程是协作的。我找不到的是一些关于线程优先级的信息,我猜具有相同优先级的线程会一直运行到完成,因为多线程是协作的,否则就会完成一次让步。如果一个线程比另一个线程具有更高的优先级呢?
它是否能够中断优先级较低的线程,或者当优先级较低的线程运行到完成时,它会继续运行?
发布于 2013-04-11 16:28:48
Lua中没有原生线程(抢占式多任务),但是正如你所说的那样,有协作式的多任务。
抢占式和协作式多任务之间的区别在于,在抢占式多任务中,“线程”不一定要运行到完成,而是可以被其他线程抢占。这是由调度程序完成的,它以固定的间隔运行,将一个线程切换到另一个线程。这就是优先级的用武之地。如果具有较高优先级的线程想要运行,它可以抢占具有较低优先级的已经运行的线程,并且调度器将在下次运行调度器时选择该线程(取决于调度策略)。
在协作多任务中,不一定要有调度器(尽管出于实际原因,有一个调度器通常是个好主意)。然而,有一些共同的过程。一个协同进程就像一个线程,只是它不能被抢占。它既可以运行到完成,也可以让位给另一个协同进程并允许其运行。
回到你的问题,如果你想要协作多任务的优先级,你需要编写一个调度器,它决定运行哪个协同进程,给定它的优先级,你需要编写你的协同进程,所以他们偶尔会放弃处理,并将控制权交回调度器。
编辑
需要澄清的是,非抢占式多任务和协作式多任务之间存在细微的区别。非抢占式多任务就有点宽泛了,因为它允许静态调度和协作式多任务。
静态调度意味着调度器可以调度周期性任务,然后可以在任务产生时运行,可能具有更高的优先级。
协作式多任务也是非抢占式多任务的一种。然而,在这里,任务只由任务本身调度,控制明确地从一个任务让给另一个任务,但它让给哪个任务,可以基于优先级。
发布于 2013-04-11 16:37:35
在Lua中,线程不能在一个Lua状态下并行运行(即在多个内核上)。没有并发,因为它是协作式多任务。只有当一个线程暂停执行(让步)时,另一个线程才能继续执行。在任何时候,两个Lua线程都不能在一个Lua状态下并发执行。
你正在谈论的是抢占--一个调度器中断一个线程让另一个线程执行。
https://stackoverflow.com/questions/15943785
复制相似问题