|
||||||
| C and C++ C and C++ forum for discussing all forms of C except for C#. These languages are powerful low level languages used for creating Operating Systems, Device Drivers, compilers and much more. |
![]() |
|
|
LinkBack | Thread Tools | Search this Thread | Display Modes |
|
|||
|
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 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); Last edited by mynickmynick; 05-08-2008 at 08:55 AM. |
| Sponsored Links |
|
|
![]() |
| Currently Active Users Viewing This Thread: 1 (0 members and 1 guests) | |
| Thread Tools | Search this Thread |
| Display Modes | |
|
|