linux条件变量若干问题

先介绍一下pthread_cond_wait()函数的调用过程,wait函数首先对互斥对象进行解锁,然后等待条件的发生,即等待pthread_cond_signal()或pthread_cond_broadcast()函数的调用,然后wait函数返回,返回时对互斥对象进行加锁。

那么在调用pthread_cond_wait()函数之前为什么要对条件变量进行加锁呢?

原因很简单,果条件不成立我们就进入阻塞,在进入阻塞这个期间,如果条件变量改变了的话,那我们就漏掉了这个条件(from APUE)。这句话不是很好理解,假如我们有thread1,thread2对全局共享变量num++,当num的值为100时,唤醒thread3,当thread3进入阻塞期间时,num值为100,此时thread1或thread2向条件变量发送信号,但是由于thread3并没有真正的进入阻塞,而是处于进入阻塞这个状态。结果,thread3便遗漏了这个条件。因此,在使用条件变量时,一定要让pthread_cond_wait()完成阻塞,所以我们要首先用互斥对象锁住条件变量,让其他线程无法使用条件变量。

还有一个问题,在使用条件变量时,为什么在让pthread_cond_wait()在while循环内,用if不可以么?

答案是不可以的,具体原因在于等待线程可能会别莫名奇妙的其他信号唤醒,因此在每次被唤醒时,我们都要检查唤醒的条件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值