Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading Lua中的线程优先级_Multithreading_Lua_Thread Priority - Fatal编程技术网

Multithreading Lua中的线程优先级

Multithreading Lua中的线程优先级,multithreading,lua,thread-priority,Multithreading,Lua,Thread Priority,我看了Lua的书,了解到Lua中的多线程是协作的。我找不到的是关于线程优先级的一些信息。我猜具有相同优先级的线程会一直运行到完成,因为多线程是协作的,或者是一种屈服。那么优先级高于另一个线程的线程呢 它能够中断优先级较低的线程吗?或者,当优先级较低的线程运行到完成时,它会运行到下一个吗?Lua中没有本机线程(抢占式多任务处理),但是正如您所说,有协作式多任务处理 抢占式和协作式多任务处理的区别在于,在抢占式多任务处理中,不一定允许“线程”运行到完成,但可以被其他线程抢占。这是由调度程序完成的,调

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


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

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

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

在协作多任务处理中,不必有调度器(尽管出于实际原因,通常最好有一个调度器)。然而,有一些共同进程。协同进程就像一个线程,只是它不能被抢占。它可以运行到完成,也可以让另一个协同进程运行

回到你的问题上来,如果你想让协作多任务具有优先级,你需要编写一个调度程序,根据优先级决定运行哪个协同进程,你需要编写协同进程,这样他们就会偶尔放弃处理,并将控制权交回调度程序

编辑

为了澄清这一点,非抢占式多任务处理和合作式多任务处理之间有着细微的区别。非抢占式多任务处理的范围更广,因为它允许静态调度和协作多任务处理

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


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

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


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

啊,好吧,可以这么说,所有线程都具有相同的优先级。Smalltalk的早期版本也有非抢占式多任务处理,但优先级较高的线程可能会中断优先级较低的线程,而优先级相同的线程则不能相互中断。没有pthreads中的“线程”,因为没有调度程序,这意味着也没有优先级的概念。任务是合作的,这意味着它们相互让步。感谢编辑部分的评论。Lua中的线程没有先发制人是多么遗憾。否则Lua无疑将是我最喜欢的脚本语言。当时,我们在使用Smalltalk使GUI响应方面遇到了这样的问题。我想我会试试Lua Lanes。不幸的是,对于需要并行运行的小事情来说,它似乎有点太重了。我过去所做的是编写一些C代码来处理线程(需要时),Lua和C非常容易集成。Lua还提供了一些pthreads绑定,允许您使用线程,但请注意,它们会使调试成为一场噩梦。