Thread starvation

J

Jakub Pavlík jn.

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.

Thank you very much.

Jakub Pavlik
 
R

Robert Klemme

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?

Cheers

robert
 
J

Jakub Pavlík jn.

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?

Cheers

robert

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
 
R

Robert Klemme

2009/1/19 Jakub Pavl=EDk jn. said:
Hello,

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

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,756
Messages
2,569,535
Members
45,008
Latest member
obedient dusk

Latest Threads

Top