Lua: preemtive (not cooperative) multitasking in Lua with thread-like structures
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
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.
You might be interested in LuaLanes which enables real multithreading for Lua.
精彩评论