Lua:Lua中的preemtive(非合作)多任务处理具有类似线程的结构

时间:2011-03-23 16:18:47

标签: multithreading lua multitasking coroutine

我想知道Lua是否内置了任何先发制人的多任务处理设施。我希望在我的多核系统上使用并发线程。

我查看了协同程序(请参阅lua-users.org/wiki/CoroutinesTutorial和stackoverflow.com/questions/3107165/there-is-a-type-named-thread-in-lua-does-anyone-know-something这个),但它似乎不适合该法案。我写了以下代码:


function foo(ver)
    local iter = 1;
    while true do
        print("foo ver="..ver.." iter="..iter);
        iter = iter + 1;
        for ii = 1,100000 do end -- busy wait
        coroutine.yield()
     end
end

co1 = coroutine.create(foo)
co2 = coroutine.create(foo)

coroutine.resume(co1, 1)
coroutine.resume(co2, 2)

while true do end -- infinite loop

function foo(ver) local iter = 1; while true do print("foo ver="..ver.." iter="..iter); iter = iter + 1; for ii = 1,100000 do end -- busy wait coroutine.yield() end end co1 = coroutine.create(foo) co2 = coroutine.create(foo) coroutine.resume(co1, 1) coroutine.resume(co2, 2) while true do end -- infinite loop


程序打印:


foo ver=1 iter=1
foo ver=2 iter=1


然后卡住了。我怀疑它只是在无限循环中等待。使用gdb附加到它会显示只有一个线程正在运行。

我怀疑协同程序是合作多任务,对吗?

如果是这样,是否有一种原生的Lua方式在Lua中拥有线程?

如果没有,我是否必须使用其他库(如www.inf.puc-rio.br/~roberto/docs/ry08-05.pdf [PDF]或kotisivu.dnainternet.net/askok/bin/lanes /)?

谢谢, 贝

2 个答案:

答案 0 :(得分:4)

Lua book中所述,协同程序确实是合作的。 ANSI C没有解决线程问题,因此在Lua中没有“本地”方式来执行抢占式多线程,就像在C中没有“本机”方式那样。相反,你将不得不依赖对底层操作的调用系统。 Lua wiki讨论了两种维护线程状态的方法。我还发现了一个blog post about coroutines,它详细介绍了这两种方法中的一种(尽管他自己并没有进入先发制人的线程)。

也许值得注意的是,Lua的书中说,“我们认为多线程对Lua来说不是一个好主意。”如果您愿意,可以在第30章中详细了解他们的关注点。

答案 1 :(得分:2)

您可能对LuaLanes感兴趣,它可以为Lua实现真正的多线程。