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

详解条件变量

时间:2017-01-20 00:06:03      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:posix   span   是你   nbsp   现象   内核空间   osi   详解   trigger   

一年多过去啦,一段时间没有posix多线程的东西,又忘记的差不多略,我打记性咋这么差,丝毫记不起来怎么用啦,还是不如烂笔头啊。

大家都知道条件变量需要配合mutex一起使用,往往是这样的:
lock->signal->unlock,  而另一边呢是:

lock->wait->unlock. 

在调用pthread_cond_wait(cond,mutex)时的执行顺序是这样的:
1. 首先获取外面的mutex, 然后当前wait push 到一个等待的queue里面,然后释放锁。但是你看wait的后面又是unlock释放mutex,这不重复啦吗?

    并不是这样,请继续往下看.

2.  pthread_cond_signal 首先获取mutex, 然后通过条件变量发送消息,立刻释放mutex。

3.  wait获取signal的消息,重新再获取mutex, 然后执行

 

为什么需要加mutex???

In Thread1:
pthread_mutex_lock(&m_mutex);   
pthread_cond_wait(&m_cond,&m_mutex);   
pthread_mutex_unlock(&m_mutex);  
 
In Thread2:
pthread_mutex_lock(&m_mutex);   
pthread_cond_signal(&m_cond);   
pthread_mutex_unlock(&m_mutex);  

假如1线程在调用cond_wait时,还没有进入wait_cond的状态, 然后线程2立马就调用啦cond_signal, 也就是signal比wait要快,这个时候cond_signal就丢失拉,使用啦mutex,则必须等到cond_wait的mutex释放后,然后线程2获取mutex, 然后才能调用cond_signal. 

cond_signal为什么要放在mutex中间呢,放在unlock后面会怎么样呢?

pthread_mutex_lock(&m_mutex);   

xxxxxxx...
pthread_mutex_unlock(&m_mutex); 
pthread_cond_signal(&m_cond); 

假如signal之前释放锁,这个时候有个低优先级的任务正在等待mutex, 而这个signal消息本是为啦去trigger一个更高优先级的线程的,这样就会出现低优先级抢占高优先级任务的现象,如果放在中间,则会先保证成功trigger本次需要trigger的任务后,然后释放锁,然后是其任务获取这个锁。

放在中间有没有问题呢?其实也有:

pthread_mutex_lock(&m_mutex);   
pthread_cond_signal(&m_cond); 
pthread_mutex_unlock(&m_mutex); 

在某先线程的实现中,会造成等待线程从内核中唤醒(收到cond_signal)后又回到内核空间(出发cond_wait线程后然后又会获取mutex),会有性能问题。 

 

详解条件变量

标签:posix   span   是你   nbsp   现象   内核空间   osi   详解   trigger   

原文地址:http://www.cnblogs.com/biglucky/p/6309055.html

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