读书人

pthread_cond_wait()//开释锁与加锁俩

发布时间: 2012-08-01 17:53:41 作者: rapoo

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

C/C++ code
pthread_cond_wait()函数一进入wait状态就会自动release mutexpthread_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 );}


[解决办法]
不知道呢。。

读书人网 >UNIXLINUX

热点推荐