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

2

3

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 https://mcmap.net/q/832522/-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

Subversive answered 23/3, 2011 at 16:18 Comment(1)
Sorry, I could not create links because of anti-spam rules.Subversive
A
4

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.

Anaxagoras answered 23/3, 2011 at 16:44 Comment(0)
A
2

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

Anthonyanthophore answered 24/3, 2011 at 8:40 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.