条件变量的作用(条件变量使用场景)

条件变量的作用(条件变量使用场景)使用条件变量的最经典的场景就是生产者和消费者 这里的代码有个问题就是 consumers 中 while 循环中 如果 Q 为空的时候 就会不停的执行 else locker unlock 这是相当资源的 那么我们对这段代码进行 改进下 consumers 在进行一次 Q 判断为空的情况 让线程休息一下 这里我们修改一下 consumers 这里我们添加这行代码 让线程休息 5 秒

大家好,我是讯享网,很高兴认识大家。



使用条件变量的最经典的场景就是生产者和消费者

 

讯享网

consumers在进行一次Q判断为空的情况,让线程休息一下,这里我们修改一下consumers().

讯享网

这里我们添加这行代码

 

让线程休息5秒

但是我们仔细想想,这样合理吗,可能有更好的解决方案,比如生产者生产出来一个产品,再通知消费者,不就可以解决消费者循环等待的问题了嘛。

生产者生产出来一个产品,再通知消费者,不就可以解决消费者循环等待的问题。利用这个思想代码就可以写成这样


讯享网

讯享网

这里是引入条件变量的头文件和创建一个全局的条件变量

 

这里在生产者生产了一个产品后,使用cond.notify_one(),来激活一个消费者。如果有多个消费者可以notify_all()

讯享网

消费者要一直wait(),直到生产者告诉它产品生产好了。

当然这里代码也是有问题的,会不会出现伪激活的情况呢,道理简单就是Q不为空时使用,就是前提。可以写成一个lamda函数。
怎么理解这里呢, 就是wait的时候,如果只有一个locker,那么如果当前进程拿到locker就往下进行了,实际上并不满足向下运行的条件。
所以要wait进行限制,这里我忘记这个叫什么了,是叫什么“预测”吧。实际上写得就是一个lamda函数,可以理解成一个if条件,就是符合情况,向下进行的条件。

所以我们还要对cond.wait(locker)进行修改

 

在面向对象编程的时候,如果使用到条件变量,一定要注意wait和析构的配合。 怎么说呢?就是加入我对象类有个资源的使用会使用到条件变量,而在使用过程某个
线程正在wait资源,而我马上就要析构这个对象了,那不就是出现bug了吗。所以说当析构的时候,一定要通知,wait条件满足赶快释放资源。
常见的操作就是,申请对象的时候将对象设置了running状态,然后在wait哪里的条件的加上判断这个对象是否处于runing状态。我写个伪代码吧

讯享网

小讯
上一篇 2025-05-02 11:08
下一篇 2025-04-25 22:25

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/178149.html