Re: glibmm thread safety
- From: Daniel Elstner <daniel kitta googlemail com>
- To: Chris Vine <chris cvine freeserve co uk>
- Cc: gtkmm-list gnome org
- Subject: Re: glibmm thread safety
- Date: Mon, 15 Jan 2007 02:32:50 +0100
Am Montag, den 15.01.2007, 00:57 +0000 schrieb Chris Vine:
> My implementation has a static pipe, and an object count is not kept for the 
> purpose of closing the pipe when all objects have been destroyed.  Once the 
> two file descriptors for the pipe are committed, they are committed.  
> Glib::Dispatcher also uses a static pipe I think, but even if it closes the 
> pipe when the last Dispatcher is destroyed (does it?) then the problem could 
> still arise.
It has one pipe per receiving thread (using Glib::StaticPrivate).  If
the last per-thread Dispatcher instance is destroyed, the pipe is closed
as well.
> A particular program may (and usually will) have multiple 
> Glib::Dispatcher objects sharing the static pipe and each object keeps its 
> own slot.  After signalling one of them from a worker thread it is always 
> possible that before the slot maintained by the Dispatcher object is executed 
> by the main loop the particular object concerned has gone out of scope.  
> Unlikely no doubt, but clearly not impossible since there is more than one 
> thread of execution.
Yes, it is possible.  You'll need extra program logic to avoid that.
> As well as a static pipe, my implemention also has a mutex-protected static 
> std::set object which keeps a record comprising the address of each 
> Dispatcher-like object in existence (the constructor inserts its address in 
> the set and the destructor removes it).  I am not sure how Glib::Dispatcher 
> indicates which Dispatcher object's slot is to be invoked, but my 
> implementation does it by having the emission of the notification send the 
> address of the notifying object over the static pipe.  Before the static pipe 
> calls the relevant slot held by the notifying object via the address sent 
> over the pipe it checks that a notifying object of that address still exists.
Same here, just without the check.
> This works provided that the notifying objects are only constructed and 
> destroyed in the main loop thread.  Unlike Glib::Dispatcher, my 
> implementation does not have this restriction but it is documented that 
> further synchronisation may be required IF they are constructed or destroyed 
> in other threads and object lifetime cannot be guaranteed.
Well, you can have multiple main loops.  I believe one of the glibmm
threading examples actually does this.
> I originally developed this independently of Glib::Dispatcher so it could be 
> used in unwrapped GTK+ (although it does rely on libsigc++).
Aah.  Glib::Dispatcher uses only small bits of the threading stuff in
glibmm, in addition to sigc++.
--Daniel
[
Date Prev][
Date Next]   [
Thread Prev][
Thread Next]   
[
Thread Index]
[
Date Index]
[
Author Index]