[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Thread starvation

Jakub Pavlík jn.

1/18/2009 6:04:00 PM

Hello,

In my game freeVikings [http://freeviki...] 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.

Thank you very much.

Jakub Pavlik

--
"Configure complete, now type 'make' and PRAY."

(configure script of zsnes - www.zsnes.com)

3 Answers

Robert Klemme

1/18/2009 7:13:00 PM

0

On 18.01.2009 19:04, Jakub Pavlík jn. wrote:
> Hello,
>
> In my game freeVikings [http://freeviki...] 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?

Cheers

robert

--
remember.guy do |as, often| as.you_can - without end

Jakub Pavlík jn.

1/19/2009 9:06:00 AM

0

> On 18.01.2009 19:04, Jakub Pavlík jn. wrote:
> >Hello,
> >
> >In my game freeVikings [http://freeviki...] 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?
>
> Cheers
>
> robert
>
> --
> remember.guy do |as, often| as.you_can - without end
>

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.

Jakub

--
"Configure complete, now type 'make' and PRAY."

(configure script of zsnes - www.zsnes.com)

Robert Klemme

1/19/2009 10:19:00 AM

0

2009/1/19 Jakub Pavl=EDk jn. <severus@post.cz>:
>> On 18.01.2009 19:04, Jakub Pavl=EDk jn. wrote:
>> >Hello,
>> >
>> >In my game freeVikings [http://freeviki...] I have code listed
>> >below.
>> >It uses threads and sometimes problem known as "thread starvation" occu=
rs.
>> >Does anyone know some solution?
>> >(A more detailed description is under the code listing.)
>> >
>> >----------------------------------
>> >def do_loading(&block)
>> > Thread.abort_on_exception =3D true
>> >
>> > load_t =3D Thread.new {
>> > Thread.current.priority =3D 1
>> > Thread.stop
>> >
>> > block.call
>> > }
>> >
>> > progressbar_t =3D Thread.new {
>> > Thread.current.priority =3D 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 calle=
d
>> >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 bui=
lt
>
> 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


--=20
remember.guy do |as, often| as.you_can - without end