Re: How to safely release a mutex?



everyone knows the answer; that's why they don't reply.  
glib follows pthread more-or-less, g_mutex_free maps to
pthread_mutex_destroy whose man page says:

  pthread_mutex_destroy destroys a mutex object, freeing the resources it
  might hold. The mutex must be unlocked on entrance. In the LinuxThreads
  implementation,  no  resources  are associated with mutex objects, thus
  pthread_mutex_destroy actually does nothing except  checking  that  the
  mutex is unlocked.

Your code idea:
> 	g_mutex_lock(mutex);
> 	g_mutex_unlock(mutex);
> 	g_mutex_free(mutex);
may "fix" your situation, but it is almost certainly wrong.
if you are already holding the lock,
which is rather likely the case, then that's deadlock,
your program will freeze.
if you aren't, then you've introduced a race condition:
after unlocking, another thread may lock the mutex
and g_mutex_free will be unhappy.

threads are difficult.

- dave

On Fri, Nov 14, 2008 at 11:01:11AM +0800, Peter Cai wrote:
> As no body seems to know the answer, I made a test:
> 
> ============================
> #include <glib.h>
> 
> int main()
> {
> 	if (!g_thread_supported ()) g_thread_init (NULL);
> 
> 	GMutex    *mutex = g_mutex_new();
> 	g_mutex_lock(mutex);
> 	g_mutex_free(mutex);
> 	return 0;
> }
> ============================
> 
> It crashes on g_mutex_free without any hesitate :)
> 
> So finally the approach I use to avoid this kind of problem is using
> another mutex, which does not need to be freed,
> to protect the one I will free.
> 
> But I am wondering if that was needed.   Can I just use:
> 
> 	g_mutex_lock(mutex);
> 	g_mutex_unlock(mutex);
> 	g_mutex_free(mutex);
> 
> If thread switches just after unlock and another thread locked mutex,
> the code might fail.
> 
> On Thu, Nov 13, 2008 at 4:41 PM, Peter Cai <newptcai gmail com> wrote:
> > Hi all,
> >
> > Is it safe to call g_free_mutex on a locked mutex?
> >
> > If it's not, what is the correct way to do that?
> >
> 
> 
> 
> -- 
> ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
> _______________________________________________
> gtk-list mailing list
> gtk-list gnome org
> http://mail.gnome.org/mailman/listinfo/gtk-list

-- 


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