Lua: preemtive (not cooperative) multitasking in Lua with thread-like structures

守給你的承諾、 提交于 2020-01-14 19:38:46

问题


I was wondering whether Lua has any preemptive multitasking facilities built-in. I would like to have concurrent threads to use on my multi-core system.

I looked into coroutines (see lua-users.org/wiki/CoroutinesTutorial and stackoverflow.com/questions/3107165/there-is-a-type-named-thread-in-lua-does-anyone-know-something-of-this), but it seems not to fit the bill. I wrote the following code:


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


The program prints:


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


and then gets stuck. I suspect it just waits in the infinite loop. Attaching to it with gdb reveals that there is only one thread running.

I suspect coroutines are cooperative multitasking, correct?

If so, is there a native, Lua way to have threads in Lua?

If not, do I have to use other libraries (like www.inf.puc-rio.br/~roberto/docs/ry08-05.pdf [PDF] or kotisivu.dnainternet.net/askok/bin/lanes/)?

Thanks, Tony


回答1:


Coroutines are indeed cooperative, as stated in the Lua book. ANSI C does not address threading, so there is no "native" way to do preemptive multithreading in Lua just as there is no "native" way to do so in C. Instead, you'll have to rely on calls to the underlying operating system. The Lua wiki discusses two ways of maintaining thread state. I also found a blog post about coroutines that goes into more detail on one of the two methods (though he doesn't himself get into preemptive threading).

It might also be worth noting that the Lua book says, "we do not think multithreading is a good idea for Lua." You can read more about their concerns in chapter 30 if you're so inclined.




回答2:


You might be interested in LuaLanes which enables real multithreading for Lua.



来源:https://stackoverflow.com/questions/5408371/lua-preemtive-not-cooperative-multitasking-in-lua-with-thread-like-structures

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!