Din*_*lla 11 lua multithreading multicore coroutine
我无法在Lua中编写一个可以加载多个CPU的程序.由于Lua 通过协同程序支持这个概念,我相信它是可以实现的.
我失败的原因可能是:
更有经验的人(我两周前发现Lua)可以指出我正确的方向吗?
The point is to write a number-crunching script that does hi-load on ALL cores...
为了Lua的权力的示范目的.
谢谢...
Nic*_*las 12
Lua协同程序与操作系统意义上的线程不同.
操作系统线程是先发制人的.这意味着它们将在任意时间运行,根据操作系统的要求窃取时间片.如果可用,它们将在不同的处理器上运行.它们可以在可能的同时运行.
Lua协同程序不这样做.协同程序可能具有"线程"类型,但一次只能有一个协同活动.协程将一直运行,直到协程本身通过发出coroutine.yield命令决定停止运行.一旦它产生,它将不再运行,直到另一个例程coroutine.resume向该特定协程发出命令.
Lua协同程序提供协作多线程,这就是它们被称为协同例程的原因.他们相互合作.一次只运行一件事,只有在任务明确说明时才切换任务.
您可能认为您可以只创建操作系统线程,在Lua中创建一些协程,然后在另一个操作系统线程中恢复每个协程.只要每个OS线程在不同的Lua 实例中执行代码,这都可以工作.Lua API是可重入的; 您可以从不同的OS线程调用它,但仅限于从不同的Lua实例调用.如果你试图通过相同的Lua实例多线程,Lua可能会做一些不愉快的事情.
所有存在的Lua线程模块都为每个线程创建备用Lua实例.Lua-lltreads只是为每个线程创建一个全新的Lua实例; 除了传递给新线程的复制参数之外,没有用于线程到线程通信的API.LuaLanes确实提供了一些交叉连接代码.
核心Lua库是不可能的(如果你不计算创建多个进程并通过输入/输出进行通信),但我认为有不同的线程库的Lua绑定.
从jpjacobs到一个相关问题的答案链接到LuaLanes,它似乎是一个多线程库.(但我没有经验.)
如果将Lua嵌入到应用程序中,通常需要将多线程以某种方式链接到应用程序多线程.