码迷,mamicode.com
首页 > 其他好文 > 详细

条件变量(三)

时间:2018-03-17 00:40:51      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:github   lan   判断   blog   gpo   unlock   问题:   blank   thread   

条件变量(二)这边文章主要纠结了pthread_cond_wait(&cond,&mutex)函数以及为何判断条件时要用while而不是if。

本文还想弄清楚另外两个关于pthread_cond_signal(&cond)的问题:

1、先改变条件值还是先调用pthread_cond_signal?

2、pthread_cond_signal写在临界区内还是临界区外?

 

问题一:先改变条件值还是先调用pthread_cond_signal?

其实都一样,因为已经持有锁了。在没有锁的情况下改变条件本来就很危险。当然可以在没有锁的情况下调用signal或者broadcast函数。

1 void signal()
2 {
3     pthread_mutex_lock(&mutex);
4     signaled = true;
5     pthread_cond_signal(&cond); //顺序可以调整
6     pthread_mutex_unlock(&mutex);
7 }

这个问题本人在github上请教过陈硕大神,见https://github.com/chenshuo/recipes/issues/18。在持有锁的情况下,没有其他线程可以从wait返回,因为阻塞在mutex_lock队列中,在等待锁,因为wait出来后要加锁:

1 void broadcast()
2 {
3     pthread_mutex_lock(&mutex_);
4     pthread_cond_broadcast(&cond_);
5     signaled_ = true;
6     pthread_mutex_unlock(&mutex_);
7 }

 

重点要讨论没有锁的情况:

线程A先pthread_cond_signal,唤醒了线程B的pthread_cond_wait,该线程唤醒后由于signal没有加锁,所以

1 void signal()
2 {
4     signaled = true;  
5     pthread_cond_signal(&cond); 
  
signaled = true;  

7 }

 

条件变量(三)

标签:github   lan   判断   blog   gpo   unlock   问题:   blank   thread   

原文地址:https://www.cnblogs.com/howo/p/8586484.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!