C++新特性(六)多线程(4)condition_variable(条件变量)、wait、notify_one、notify_all

一,条件变量的作用

学过操作系统的同学们应该知道,在进程管理那一章节,为了管理进程互斥进入临界区有了互斥信号量,这和我们线程里互斥访问共享数据思路差不多。但进程管理中同样有进程同步的管理,例如最经典的生产者消费者问题:缓冲区可容纳10个产品,因此生产者生产时必须先确定缓冲区有空位;消费者消费时必须确定缓冲区有产品。对于我们上一篇讲的场景来说——该场景模拟一个简单的游戏服务器,该服务器中有两个线程,一个线程负责往一个共享队列写玩家命令数据;另一个线程负责从这个共享队列中读取玩家命令并执行。共享队列的长度没有限制,所以玩家命令输入线程不需要管队列还能不能存命令;但是处理玩家命令线程就不同了,它应该先确认共享队列中有数据,有数据以后再进行处理。
要实现上述的功能,C++11多线程提供了condition_variable类,可以直译为条件变量,在该场景中,处理玩家命令线程等待条件(共享队列是否有数据)出现,而玩家命令输入线程在输入数据到共享队列以后就可以通知玩家命令处理线程。这是一个大致的过程,下面先介绍一下condition_variable类,然后结合代码具体演示一下。

二,conditioin_variable;wait()

std::condition_variable实际上是一个类,是一个和条件相关的类,说白了就是等待一个条件达成。
首先在类的私有变量里添加一个类对象;

std::condition_variable condition;//声明一个条件变量

然后在outMsgRecvQueue()中使用该条件变量,等待一个条件

void outMsgRecvQueue() {
   
        for (int i = 0; i < 4000; ++i) {
   
            std::unique_lock<std::mutex> sbguard(my_mutex);//先上锁
            condition.wait(sbguard, [this] {
   if (!msgRecvQueue.empty())//等待条件变量成立,成立条件为第二个参数返回值
                return true;                                        //也可以不带第二个参数,具体效果后面会说明
            return false;
                }</
  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值