Jump to content

Pthread_cond_wait if cancelled leaves mutex locked deadlocking other threads?!

- - - - -

  • Please log in to reply
No replies to this topic

#1
mynickmynick

mynickmynick

    Newbie

  • Members
  • PipPip
  • 11 posts
From the following source code

int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
{
volatile pthread_descr self = thread_self();

__pthread_lock(&cond->__c_lock, self);
enqueue(&cond->__c_waiting, self);
__pthread_unlock(&cond->__c_lock);
pthread_mutex_unlock(mutex);
suspend_with_cancellation(self);
pthread_mutex_lock(mutex);
/* This is a cancellation point */
if (THREAD_GETMEM(self, p_canceled)
&& THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE) {
/* Remove ourselves from the waiting queue if we're still on it */
__pthread_lock(&cond->__c_lock, self);
remove_from_queue(&cond->__c_waiting, self);
__pthread_unlock(&cond->__c_lock);
pthread_exit(PTHREAD_CANCELED);
}
return 0;
}

it seems that when a thread gets canceled while waiting for cond it performs
pthread_mutex_lock(mutex);
...
pthread_exit(PTHREAD_CANCELED);

and leaves mutex locked?!
so anothe thread is potentially deadlocked?!
I tried to look in the source for pthread_exit() if and when the mutex is released but I didn't figure out!


So may be to prevent this the correct usage is


  pthread_mutex_lock(mutex);

  pthread_cleanup_push(pthread_mutex_unlock,mutex);

  while (...) pthread_cond_wait(cond,mutex); 

......

  pthread_cleanup_pop();

  pthread_mutex_unlock(mutex);



what you think?

Edited by mynickmynick, 08 May 2008 - 05:55 AM.





1 user(s) are reading this topic

0 members, 1 guests, 0 anonymous users