[Date Prev][Date Next][Thread Prev][Thread Next]
- Subject: Re: Preemptive Threads, CloseThread (or the lack thereof)
- From: "Wim Couwenberg" <w.couwenberg@...>
- Date: Thu, 28 Aug 2003 17:35:46 +0200
Some things to remember:
1. lua_newthread(L) also leaves the created thread on the stack of L. This
prevents it from being immediate collection by gc. This also means that if
you're just dropping (ignoring) this stack slot, the thread will be happily
collected while you're still using it from C (by its lua_State pointer),
because indeed it is not reachable from the Lua root set. So the lua thread
value is essential to keep around as well.
2. Though called "threads" in the manual, this does *not* imply that you
can simply let a native preempting thread run it. The Lua environment is
reentrant, but it is *not* thread safe! So you should implement some thread
cooperation scheme. There are several ways to go about, but each comes with
its own difficulties (i.e. overhead.)
a. Use hook functions to re-acquire a mutex every x lines/opcodes.
(sort of preemptive cooperation!? :-) )
b. Define the lua_lock and lua_unlock macro's to handle some mutex.
c. If you have high and low priority threads you might want to run the
high priority ones uninterrupted, while the low priority threads
release and re-acquire their mutex on request in a hook function.