admin管理员组

文章数量:1599428

文章目录

  • 一,条件变量的作用
  • 二,conditioin_variable;wait()
  • 三,conditioin_variable;notify_one()
    • 补充1——wait函数没有第二个参数可能会有的问题
    • 补充2——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;
                });
            int command = msgRecvQueue.front();// 返回第一个元素,不检查元素是否存在
            msgRecvQueue

本文标签: 变量多线程新特性条件notifyone