有关线程同步pthread_cond_wait()问题请教现有如下代码:有两个条件变量cond和cond2 ;一把锁mutex线程1 在
有关线程同步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丢失的情况,导致目标线程没能被及时唤醒.这种情况你就得结合程序分析下,会不会有问题.