[Date Prev][Date Next][Thread Prev][Thread Next]
- Subject: Re: Lua threads share global data?
- From: Rici Lake <lua@...>
- Date: Thu, 22 Dec 2005 16:24:00 -0500
On 22-Dec-05, at 4:04 PM, John Klimek wrote:
Thanks for the information!
So... threads share the global environment with the parent lua_state.
Therefore, if I change a global variable in my thread, it WILL also
change in the parent lua_state.
How can I prevent this and give my thread it's own global environment?
As I mentioned in the wiki page, you can push a table onto the stack
However, it's not as simple as that. The table actually has to have all
sorts of stuff in it, like the base library functions and the standard
library tables (at least, the ones you want to use) plus any extension
libraries you've defined, etc.
One way to accomplish all that is to use an __index metamethod so that
your new globals table inherits from the base globals table. However,
you still need to have some stuff in the globals table because Lua
(5.0.2 anyway) relies on things being in the globals table, and in many
cases it does a rawget rather than a gettable, so you generally want to
put baselib into the new globals table anyway.
Also, every time I create a thread (in Delphi using newThread =
lua_newthread(_luaVM)), the thread seems to remain on the stack even
after my lua_dofile() is finished.
Yes, indeed. See lua_pop()
So, after creating five or six threads I have ALL of them on top of
the stack in my main program. The manual says to use
lua_closethread() after calling lua_dofile() but lua_closethread()
What manual would that be? .... lua_dofile() is deprecated, as well. See
luaL_loadfile() and lua_pcall()