Multithreading Lua:Lua中具有线程结构的抢占式(非合作)多任务处理

Multithreading Lua:Lua中具有线程结构的抢占式(非合作)多任务处理,multithreading,lua,multitasking,coroutine,Multithreading,Lua,Multitasking,Coroutine,我想知道Lua是否有内置的抢先多任务功能。我想在我的多核系统上使用并发线程 我研究了协同程序(见lua-users.org/wiki/CoroutinesTutorial和stackoverflow.com/questions/3107165/there-is-a-type-named-thread-in-lua-does-any-know-sof-this),但它似乎不符合要求。我编写了以下代码: function foo(ver) local iter = 1; whil

我想知道Lua是否有内置的抢先多任务功能。我想在我的多核系统上使用并发线程

我研究了协同程序(见lua-users.org/wiki/CoroutinesTutorial和stackoverflow.com/questions/3107165/there-is-a-type-named-thread-in-lua-does-any-know-sof-this),但它似乎不符合要求。我编写了以下代码:


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


该程序打印:


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/)

谢谢,
Tony

正如在报告中所述,合作项目确实是合作的。ANSI C不处理线程,因此在Lua中没有“本机”方法来执行抢占式多线程处理,就像在C中没有“本机”方法那样。相反,您必须依赖对底层操作系统的调用。讨论了两种维护线程状态的方法。我还发现了一个关于这两种方法中的一种更详细的方法(尽管他自己并没有进入先发制人线程)


可能还值得注意的是,Lua的书中说,“我们认为多线程对Lua来说不是一个好主意。”如果您愿意,您可以在第30章中阅读更多关于他们关注的问题。

您可能会感兴趣的是,哪一个支持Lua的真正多线程。

抱歉,由于反垃圾邮件规则,我无法创建链接。