2011-06-17 74 views
5

我还没有能够在Lua中编写一个程序来加载多个CPU。由于Lua supports the concept via coroutines,我相信这是可以实现的。Lua ::如何编写简单的程序,将加载多个CPU?

理由让我没有可以是一个:

  • 这是不可能在Lua
  • 我不能把它☺写(希望是这种情况

有人更有经验的人(两周前我发现了Lua)指出我的方向是正确的吗?


The point is to write a number-crunching script that does hi-load on ALL cores... 对于Lua中的功率示范的目的。

谢谢...

回答

7

Lua的协程是不一样的东西在操作系统感线程。

操作系统线程处于抢占状态。这意味着它们将在任意时间运行,窃取OS所规定的时间片。如果可用,它们将在不同的处理器上运行。如果可能的话,他们可以同时运行。

Lua协同程序不这样做。协程可能有“线程”类型,但是一次只能有一个协程运行。协程将运行,直到协程本身通过发出coroutine.yield命令决定停止运行。一旦它产生了,它就不会再运行,直到另一个例程向该特定协程发出coroutine.resume命令。

Lua协程提供合作多线程,这就是为什么他们被称为co例程。他们相互合作。一次只运行一件事,并且只有在任务明确说明时才切换任务。

您可能会认为您可以创建操作系统线程,在Lua中创建一些协程,然后在不同的操作系统线程中恢复每个协程。只要每个操作系统线程都在不同的Lua instance中执行代码,就可以工作。 Lua API是可重入的;您可以从不同的操作系统线程调用它,但如果从不同的Lua实例调用只有。如果您尝试通过相同的Lua实例进行多线程,Lua可能会做不愉快的事情。

所有存在的Lua线程模块为每个线程创建备用的Lua实例。 Lua-lltreads只是为每个线程创建一个全新的Lua实例;除了传递给新线程的参数外,没有用于线程间通信的API。 LuaLanes确实提供了一些交叉连接代码。

6

这是不可能的核心Lua库(如果你不指望创建多个进程,并通过输入/输出通信),但我认为有Lua的绑定不同的线程库在那里。

answer from jpjacobs to one of the related questions链接到LuaLanes,这似乎是一个多线程库。 (尽管我没有经验)。

如果你将Lua嵌入到应用程序中,你通常会希望将多线程以某种方式链接到应用程序多线程。

1

除了已经提出的LuaLanes,llthreads和其他东西here,还有一个更简单的方法。

如果您使用的是POSIX系统,请尝试使用posix.fork()(从luaposix)以旧式的方式进行操作。您知道,将任务分成批次,分配与核心数量相同的进程数量,紧缩数字,整理结果。

此外,请确保您使用LuaJIT 2以获得最大速度。

0

这很容易,只需创建多个Lua解释器并在其中运行lua程序。

Lua multithreading是一个无共享模型。如果您需要交换数据,则必须将数据序列化为字符串,并使用c扩展名或套接字或任何类型的IPC将它们从一个解释器传递到另一个解释器。

0

通过类似IPC的传输机制序列化数据不是跨线程共享数据的唯一方式。

如果您使用C++等面向对象的语言进行编程,那么很可能多个线程通过对象指针跨线程访问共享对象,但这样做并不安全,除非您提供某种类型的保证没有两个线程会尝试同时读取和写入相同的数据。

有许多选择,你可能会这样做,无锁和免等待机制变得越来越流行。