Jump to content

  • Log In with Google      Sign In   
  • Create Account

Interested in a FREE copy of HTML5 game maker Construct 2?

We'll be giving away three Personal Edition licences in next Tuesday's GDNet Direct email newsletter!

Sign up from the right-hand sidebar on our homepage and read Tuesday's newsletter for details!


We're also offering banner ads on our site from just $5! 1. Details HERE. 2. GDNet+ Subscriptions HERE. 3. Ad upload HERE.


[Lua] Seeking advice for multiple OS Threads, handling lua_State


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
4 replies to this topic

#1 Zouflain   Members   -  Reputation: 532

Like
0Likes
Like

Posted 07 February 2014 - 04:05 PM

I've hit a brick wall when it comes to an algorithm I'm working on. Data objects are distributed on a quad-tree, and each leaf node is batch processed by an OS thread from a threadpool. The actual processing happens in Lua, however, and that's where I run into serious problems. I understand that every OS Thread should have its own lua_State, but initialization of the Lua script is slow: it's a very large, very extensive script split between multiple files with plenty of C functions tied in - parsing and initializing all this again and again would be nightmarishly slow. Instead I'd rather initialize once, copy the read-made data into each thread's lua_State, and then run the processing. Unfortunately, Lua seems to define "thread" as something totally different than an OS thread, and functions like lua_newthread or lua_xmove are only intended for single-threaded applications. It also makes googling about this almost impossible: everything is about co-routines, which I can't see being helpful here. Any advice for moving forward would be greatly appreciated.

Sponsor:

#2 CableGuy   Members   -  Reputation: 922

Like
0Likes
Like

Posted 08 February 2014 - 01:28 AM

Can't you initialize your Lua states before hand and store them in an array, one for each thread?

Also you might want to look here, some of the libraries allow concurrent execution of Lua code


Edited by CableGuy, 08 February 2014 - 01:33 AM.


#3 Pink Horror   Members   -  Reputation: 1211

Like
0Likes
Like

Posted 08 February 2014 - 02:37 PM

I've hit a brick wall when it comes to an algorithm I'm working on. Data objects are distributed on a quad-tree, and each leaf node is batch processed by an OS thread from a threadpool. The actual processing happens in Lua, however, and that's where I run into serious problems. I understand that every OS Thread should have its own lua_State, but initialization of the Lua script is slow: it's a very large, very extensive script split between multiple files with plenty of C functions tied in - parsing and initializing all this again and again would be nightmarishly slow. Instead I'd rather initialize once, copy the read-made data into each thread's lua_State, and then run the processing. Unfortunately, Lua seems to define "thread" as something totally different than an OS thread, and functions like lua_newthread or lua_xmove are only intended for single-threaded applications. It also makes googling about this almost impossible: everything is about co-routines, which I can't see being helpful here. Any advice for moving forward would be greatly appreciated.

 

Why couldn't your threadpool initialize in parallel? Why would it take longer to initialize your whole thread pool than to initialize one thread? Are you only able to initialize one at a time?



#4 ddn3   Members   -  Reputation: 1305

Like
0Likes
Like

Posted 08 February 2014 - 04:46 PM

There are some thread libraries which sit on top of Lua and give Lua a threading model complete with thread safety objects. That way a single Lua state can spawn off multiple threads and still share the same global Lua state. I've not used them too much, but I did do some research into this. See if any of these work for you ?

 

http://lua-users.org/wiki/MultiTasking

http://www.luteus.biz/Download/LoriotPro_Doc/LUA/LUA_For_Windows/lanes/comparison.html

 

I believe some of the threading models do "copy" the global state across multiple lua_state objects across threads just as you want, so it's worth looking through them.

 

Good Luck!



#5 Zouflain   Members   -  Reputation: 532

Like
0Likes
Like

Posted 09 February 2014 - 02:21 AM

 

Can't you initialize your Lua states before hand and store them in an array, one for each thread?

 
You're absolutely right. I realized this on the way to work after posting. All persistant values (sans the function definitions) were stored in an SQL database, so there's no reason not to just pre-load the virtual machines with the LUA code.

Initializatio might be slow, but it only has to happen once (even though the threads might dynamically open and close, they can simply re-use the already-initialized lua states). Thanks for pointing this out.




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS