Re: Multiple threads and gtk_main()



On Tue, 2007-07-10 at 17:44 +0200, Gabriele Greco wrote:
I've a few threads (more than one) doing some work (not accessing GTK 
functions), I'd like to have a general way to make them notify their 
work to the main loop.

I used the g_idle_add() in the previous context where I had only a 
thread with this behaviour, but with two or more threads the 
g_idle_add() method of notification is not correct IMHO (what happens if 
  two threads call g_idle_add() before the call of the first one is 
processed by the glib main loop?)

I thought about a mutex solution, something like this:

thread X:
      lock idle_mutex
      g_idle_add(my_idle_func)

my_idle_func:
      unlock idle_mutex
      [update the gui]
      return FALSE

This way should work but when I use mutexes in context I've not full 
control on I always fear unhandled deadlock situations...

I though about using a GAsyncQueue for every thread but in this way the 
problem I have is how to notify the main loop that there is something on 
a queue, I've not found anything in the documentation... I fear the only 
  way it's to use a pipe or a socket, or an idle function, but in this 
case I will occur again in the locking problem, I hope I'm wrong about 
this so I'm asking here :)

If you were on a unix/linux box, I'd suggest writing to a pipe.  It
allows multiple writers and one reader, and you can make a select call
in a g_idle_add() callback to see if it's readable and handle it if so.*

I haven't experienced a locking problem with regard to writing to a pipe
or socket.  Multiple threads can be writing to a pipe, but each chunk
passed is guaranteed to be written intact, and you've only got one
reader, so no contention problem on that end.  As long as you always
know how much a writer has sent you (a length field in a fixed-size
header, or fixed-size messages).

And if all readers and writers are in the same address space, they only
need to pass the address of the object, so you are writing just
pointers, and using ring buffers, right?


  // Wally

*Let me add that I would first take a closer look at what gtk provides
that's more processor efficient than an idle-loop for checking whether
something is readable.
-- 
Wallace Owen L-3Com com
Office: 619.278.2084
Cell:   619.990.2286



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]