线程条件变量

pthread_cond_t cod = PTHREAD_COND_INITIALIZER

int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t * condattr);

int pthread_cond_destory(pthread_cond_t *cond)

1永远不要拷贝条件变量,

2动态初始化条件变量时,应该在不需要时使用pthread_cond_destory,在释放时确认没有线程在等待条件变量,最好是使用广播了

该条件变量,确认唤醒其他线程,然后不会再有其他线程使用该条件变量



等待条件变量

int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex); //解锁互斥量

int pthread_cond_timewait(pthread_cond_t *cond,pthread_mutex_t *mutex,struct timespec *expiration);

1 在锁住相关互斥量之后,和等待条件变量之前判断谓词是很重要的,有效防止pthread_cond_wait接受到pthread_cond_singal 和pthread_cond_broadcast而产生一直阻塞

2 因为 虚假唤醒, 唤醒之后检测谓词,被拦截的唤醒,松散的谓词 三个状态出现,唤醒之后判断谓词是否为真是值得的

3对待虚假唤醒 (条件就是谓词)

  1. while(条件不满足){  
  2.    condition_wait(cond, mutex);  
  3. }  
  4. 而不是:  
  5. If( 条件不满足 ){  
  6.    Condition_wait(cond,mutex);  
  7. }  

4. 解锁和等待转移(wait morphing) 

解锁互斥量mutex和发出唤醒信号condition_signal是两个单独的操作,那么就存在一个顺序的问题。谁先随后可能会产生不同的结果。如下: 
[color=red](1) 按照 unlock(mutex); condition_signal()顺序, 当等待的线程被唤醒时,因为mutex已经解锁,因此被唤醒的线程很容易就锁住了mutex然后从conditon_wait()中返回了。 

C代码    收藏代码
  1. //...  
  2. unlock(mutex);    
  3. condition_signal(cond);  


(2) 按照 condition_signal(); unlock(mutext)顺序,当等待线程被唤醒时,它试图锁住mutex,但是如果此时mutex还未解锁,则线程又进入睡眠,mutex成功解锁后,此线程在再次被唤醒并锁住mutex,从而从condition_wait()中返回。 
C代码    收藏代码
  1. //...  
  2. condition_signal(cond);  
  3. unlock(mutex);   


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小喾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值