From: Robert Klemme Date: 2009-01-19T19:18:52+09:00 Subject: Re: Thread starvation 2009/1/19 Jakub Pavlík jn. : >> On 18.01.2009 19:04, Jakub Pavlík jn. wrote: >> >Hello, >> > >> >In my game freeVikings [http://freevikings.sf.net] I have code listed >> >below. >> >It uses threads and sometimes problem known as "thread starvation" occurs. >> >Does anyone know some solution? >> >(A more detailed description is under the code listing.) >> > >> >---------------------------------- >> >def do_loading(&block) >> > Thread.abort_on_exception = true >> > >> > load_t = Thread.new { >> > Thread.current.priority = 1 >> > Thread.stop >> > >> > block.call >> > } >> > >> > progressbar_t = Thread.new { >> > Thread.current.priority = 2 >> > load_t.run >> > >> > loop { >> > paint_loading_screen @app_window, true >> > sleep 0.3 >> > } >> > } >> > >> > load_t.join >> > Thread.kill progressbar_t >> >end >> >---------------------------------- >> > >> >It's an instance method of class Game and is used in this way: >> >a_game.do_loading { >> > # load something here >> >} >> > >> >Purpose of this method is to show a simple progressbar while doing some >> >long-lasting operation (e.g. loading new level). >> > >> >It creates two threads: load_t, in which given block is executed >> >and progressbar_t, which regularly calls Game#paint_loading_screen >> >(method, which repaints loading screen with progressbar). >> > >> >Thread progressbar_t has higher priority, because I need it to be called >> >often and not to e.g. wait for load_t's end. >> > >> >Unfortunatelly from time to time Thread load_t is somehow "suspended" - >> >progressbar shows progress on and on, but nothing happens. >> >I think it's a case of so called "thread starvation" and would be very glad >> >to know how to avoid it. >> >> I guess this depends on what you do in "block". It's difficult to >> analyze this without having all the information... >> >> Can you provide more detail? > > Method do_loading is used for two purposes: > 1. loading of a world: > code in the block goes through a tree of directories and in each reads > a XML file > 2. loading of a level: > two XML files (level description & map data created in Tiled) + > one ruby script (which often requires many others) are loaded from a > given directory, many graphics are loaded and huge SDL surfaces are built > > Thread starvation usually occurs in the second case. This is still pretty vague IMHO. Did you try to trace execution via set_trace_func? That might help. Cheers robert -- remember.guy do |as, often| as.you_can - without end