其他分享
首页 > 其他分享> > 简单讲讲条件变量pthread_cond究竟是干什么的和适用场景

简单讲讲条件变量pthread_cond究竟是干什么的和适用场景

作者:互联网

上学的时候看到pthread_cond就觉得有点复杂,学了半天,而且这玩意经常伴随消费生产模型出现,更让人迷迷糊糊。工作了以后用的不多,大部分场景下加个锁就够了,今天突然看到有个go项目中用了cond,仔细琢磨了下cond到底该怎么用,什么时候用:

条件变量(cond)和锁(mutex)是紧密相关的,锁的使用场景是:这件事同时只有一个人能做,我抢到锁就进去做了,我做完再给下一个人做。这时就加个锁,保证某些变量同时只被一个线程操作。
什么情况下要用到条件变量呢,首先这件事还是只能一个人做,所以还要用锁。但线程抢到锁了后,发现还要等待一些条件满足,才能做。
这时怎么办呢?难道抢到锁的线程要不停检查这个条件吗?消耗高不说,每次检查完总得sleep一下吧,不然cpu都空跑了,sleep的时间怎么定?sleep少了,消耗高;多了,又有延迟,不能即时发现条件满足了。而且你抢到锁一直检查,别人也拿不到锁了。
这时就引入了条件变量,抢到锁的线程发现条件未满足时,释放锁,使用pthread_cond_wait()挂起自己;这时别的线程也能获取锁进来,发现条件不满足同样挂起;直到条件满足后,由其他方调用pthread_cond_broacast(唤醒全部挂起的线程)或者pthread_cond_signal(唤醒一个线程),通知这些挂起的线程说:条件好了,快来做吧,这时,第一个抢到锁的线程进去就可以干活了。

为什么提到cond经常会提到消费者生产者模型呢?
因为生产者消费者模型正好满足这种情况:1. 同一时间事情只能一人来做:生产者消费者都要操作同一个队列(或者其他容器),容器需要桶保护 2. 要满足条件才能干事:需要调生产出东西来,才能消费。所以消费方是pthread_cond_wait等待的那一方,生产者是pthread_cond_signal通知的那一方。

标签:变量,讲讲,cond,pthread,抢到,条件,线程
来源: https://blog.csdn.net/weixin_42919176/article/details/100118801