我无法在Lua中编写一个可以加载多个CPU的程序。自Lua supports the concept via coroutines以来,我相信它是可以实现的。
我失败的原因可能是:
更有经验的人(我两周前发现Lua)可以指出我正确的方向吗?
The point is to write a number-crunching script that does hi-load on ALL cores...
用于Lua权力的示范目的。
谢谢...
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绑定。
answer from jpjacobs to one of the related questions链接到LuaLanes,它似乎是一个多线程库。 (但我没有经验。)
如果将Lua嵌入到应用程序中,通常需要将多线程以某种方式链接到应用程序多线程。
除了LuaLanes,请看看llthreads
只需创建多个Lua解释器并在所有这些解析器中运行lua程序即可。
Lua多线程是一种无共享的模型。如果需要交换数据,则必须将数据序列化为字符串,并使用c扩展或套接字或任何类型的IPC将它们从一个解释器传递到另一个解释器。
通过类似IPC的传输机制序列化数据并不是跨线程共享数据的唯一方法。
如果你使用像C ++这样的面向对象语言编程,那么多个线程很可能通过对象指针跨线程访问共享对象,这样做是不安全的,除非你提供某种保证,没有两个线程会尝试同时读取和写入相同的数据。
对于如何做到这一点有很多选择,无锁和无等待机制正变得越来越流行。