pthread_cond_wait()//释放锁与加锁俩个动作?pthread_cond_signal()来触发pthread_cond_wait()函数

pthread_cond_wait()函数一进入wait状态就会自动release mutex pthread_cond_wait() 一旦wait成功获得cond 条件的时候会自动 lock mutex.

C/C++ code?2. 由上解释可以看出,pthread_cond_wait() 必须与pthread_mutex 配套使用。   pthread_cond_wait()函数一进入wait状态就会自动release mutex.   In Thread1:   pthread_mutex_lock(&m_mutex);    pthread_cond_wait(&m_cond,&m_mutex);    pthread_mutex_unlock(&m_mutex);     In Thread2:   pthread_mutex_lock(&m_mutex);    pthread_cond_signal(&m_cond);    pthread_mutex_unlock(&m_mutex);     为什么要与pthread_mutex 一起使用呢? 这是为了应对线程1在调用pthread_cond_wait()但线程1还没有进入wait cond的状态的时候,此时线程2调用了 cond_singal 的情况。 如果不用mutex锁的话,这个cond_singal就丢失了。加了锁的情况是,线程2必须等到 mutex 被释放(也就是 pthread_cod_wait() 进入wait_cond状态 并自动释放mutex) 的时候才能调用cond_singal.   3. pthread_cond_wait() 一旦wait成功获得cond 条件的时候会自动 lock mutex.   这就会出现另一个问题。这是因为   The pthread_cond_wait() and pthread_cond_timedwait() is a cancellation point.   In Thread3:   pthread_cancel(&m_thread);   pthread_join();   因为pthread_cond_wait() and pthread_cond_timedwait()    是线程退出点函数,因此在Thread3中   可以调用pthread_cancel()来退出线程1。那样显然线程1会在 pthread_cond_wait(&m_cond,&m_mutex);    和 pthread_mutex_unlock(&m_mutex); 之间退出,    pthread_cond_wait() 函数返回后自动lock住了mutex, 这个时候线程1退出(并没有运行到pthread_mutex_unlock()),如果Thread2这个时候就再也得不到lock状态了。   通常解决这个问题的办法如下   void cleanup(void *arg) {    pthread_mutex_unlock(&mutex); } void * thread1(void * arg) {     pthread_cleanup_push(cleanup, NULL); // thread cleanup handler      pthread_mutex_lock(&mutex);    pthread_cond_wait(&cond, &mutex);    pthread_mutex_unlock(&mutex);    pthread_cleanup_pop(0 ); } 

 

Copyright © 2007-2012 www.chuibin.com 六维论文网 版权所有