日期:2014-05-16  浏览次数:20796 次

有关线程同步pthread_cond_wait()问题请教
现有如下代码:
有两个条件变量cond和cond2 ;一把锁mutex

线程1 在等待:

pthread_cond_wait(&cond, &mutex);

线程2:

pthread_mutex_unlock(&mutex);
pthread_cond_signal(&cond);
pthread_cond_wait(&cond2, &mutex);

请问各位大侠:线程2pthread_cond_wait(&cond2, &mutex);是不是会同线程1抢占mutex锁呢?

pthread_cond_wait pthread_mutex pthread_cond_signal

------解决方案--------------------
线程2执行pthread_crond_wait()的时候会将锁释放掉。只有当函数返回了才会重新枷锁。
------解决方案--------------------
引用:
引用:线程2执行pthread_crond_wait()的时候会将锁释放掉。只有当函数返回了才会重新枷锁。

thank you for your reply!!

您回答的是没错哈。
可是我线程2是先解锁,然后发送信号,进而pthread_crond_wait(),这时,这个wait会不会比线程1的wait更先被唤醒而……


那你这根本就是错误的用法!
先lock mutex, 再wait ,再unlock mutex才是正确用法 。!
man pthread_cond_wait
The  mutex  must  be
       locked  by  the calling thread on entrance to pthread_cond_wait. Before
       returning to the calling thread,  pthread_cond_wait  re-acquires  mutex
       (as per pthread_lock_mutex).
------解决方案--------------------
引用:
引用:引用:引用:线程2执行pthread_crond_wait()的时候会将锁释放掉。只有当函数返回了才会重新枷锁。

thank you for your reply!!

您回答的是没错哈。
可是我线程2是先解锁,然后发送信号,进而pthread_c……


你这种写法,还有一种可能会发生的情况 。 那就是死锁。。因为按照语义,signal发信号是唤醒当前的等待线程。。所以如果signal在线程1 wait前,并且在线程2 signal到wait间起作用的话,那么这个signal就丢失了!!最后死锁。。。
这就是不按照POSIX语义规则使用的可能情况,也许正常情况不会发生。但如果系统比如负载很重等等原因,还是有可能会发生的。。。
------解决方案--------------------
引用:
弱弱的问一句,pthread_cond_signal(&cond);执行的时候要枷锁吗,我觉得不用吧


这个可以不加锁.
得注意分析下,是否会出现信号丢失的情况导致的问题.
比如另一线程还未pthread_cond_wait,而当前线程已经signal了,这时信号就会丢失.然后另一线程才wait上去.
当然一般wait的用法是:
lock
if(!condition)
    pthread_cond_wait
//process
unlock.
这种情况没signal不用加锁,没问题..
但如果没有condition((当然改变condition是需要加锁操作的)),则可能会出现signal丢失的情况,导致目标线程没能被及时唤醒.这种情况你就得结合程序分析下,会不会有问题.