学习muduo库(5)之有界缓冲区类无界缓冲区类BlockingQueue和BoundedBlockingQueue

本文详细探讨了muduo库中的BlockingQueue和BoundedBlockingQueue。BlockingQueue利用std::deque实现线程安全,借助条件变量提高效率,避免空队列时的无效等待。BoundedBlockingQueue作为有界环形缓冲区,读写操作同样应用了条件变量来协调多线程竞争。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UML:

BlockingQueue

这是一个用std::deque设计的线程安全的队列,其实要想简单的保证队列的线程安全,只需要在读写的时候加上锁就行啦。为了提高效率,这里引入了条件变量。产生的效果就是,当读出数据时,发现这个队列是空的,就把这个线程挂起到条件变量上,当写入数据的时候就唤起所有正在等待条件变量的线程。写法如下:

void put(const T& x)
  {
    MutexLockGuard lock(mutex_); //往队列中加入元素时,需要加锁保护
    queue_.push_back(x);
    notEmpty_.notify(); // wait morphing saves us //加入元素后,通知需要读取线程
    // http://www.domaigne.com/blog/computing/condvars-signal-with-mutex-locked-or-not/
  }

  void put(T&& x) //如果加入的元素,为右值时,用这种重载的函数
  {
    MutexLockGuard lock(mutex_);
    queue_.push_back(std::move(x));
    notEmpty_.notify();
  }

  T take()
  {
    MutexLockGuard lock(mutex_);//加锁
    // always use a while-loop, due to spurious wakeup
    while (queue_.empty())
    {
      notEmpty_.wait();//如果队列为空,线程被挂起,等待条件变量来唤起
    }
    assert(!queue_.empty());
    T front(std::move(queue_.front()));//返回队列第一个元素
    queue_.pop_front();//弹出队列的第一个元素
    return std::move(front);
  }

BoundedBlockingQueue

是一个有界环形的缓冲区。因此读写都要有一个条件变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值