我想知道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 /)?
谢谢, 贝
答案 0 :(得分:4)
如Lua book中所述,协同程序确实是合作的。 ANSI C没有解决线程问题,因此在Lua中没有“本地”方式来执行抢占式多线程,就像在C中没有“本机”方式那样。相反,你将不得不依赖对底层操作的调用系统。 Lua wiki讨论了两种维护线程状态的方法。我还发现了一个blog post about coroutines,它详细介绍了这两种方法中的一种(尽管他自己并没有进入先发制人的线程)。
也许值得注意的是,Lua的书中说,“我们认为多线程对Lua来说不是一个好主意。”如果您愿意,可以在第30章中详细了解他们的关注点。
答案 1 :(得分:2)
您可能对LuaLanes感兴趣,它可以为Lua实现真正的多线程。