From the following source code
it seems that when a thread gets canceled while waiting for cond it performsCode: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; }
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
what you think?Code:pthread_mutex_lock(mutex); pthread_cleanup_push(pthread_mutex_unlock,mutex); while (...) pthread_cond_wait(cond,mutex); ...... pthread_cleanup_pop(); pthread_mutex_unlock(mutex);



LinkBack URL
About LinkBacks



