全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C++如何实现一个线程安全的队列?(代码示例)

使用unique_lock而非lock_guard是因为wait需自动释放并重获锁,而lock_guard不支持中途解锁。

std::mutex 配合 std::queuestd::condition_variable 就能写出一个真正可用的线程安全队列,核心是保护共享状态、避免忙等待、支持阻塞式读写。

基础模板:带锁+条件变量的阻塞队列

以下是一个泛型、线程安全、支持 push/pop 阻塞等待的队列实现:

#include 
#include 
#include 

template 
class ThreadSafeQueue {
private:
    std::queue queue_;
    mutable std::mutex mutex_;
    std::condition_variable cond_not_empty_;
    std::condition_variable cond_not_full_;  // 可选:若加容量限制才需要

public:
    void push(T value) {
        std::lock_guard lock(mutex_);
        queue_.push(std::move(value));
        cond_not_empty_.notify_one();  // 通知可能在 wait 的 pop
    }

    bool try_pop(T& result) {
        std::lock_guard lock(mutex_);
        if (queue_.empty()) return false;
        result = std::move(queue_.front());
        queue_.pop();
        return true;
    }

    void wait_and_pop(T& result) {
        std::unique_lock lock(mutex_);
        cond_not_empty_.wait(lock, [this] { return !queue_.empty(); });
        result = std::move(queue_.front());
        queue_.pop();
    }
};

为什么用 unique_lock 而不是 lock_guard 做 wait?

cond_not_empty_.wait() 必须传入 std::unique_lock,因为 wait 会自动释放锁、挂起线程,等被唤醒后再重新加锁。lock_guard 不支持中途解锁,无法配合 condition_variable 使用。

  • wait 内部先 unlock,避免其他线程无法 push
  • 唤醒后自动 re-lock,保证临界区安全
  • 使用谓词(lambda)可防止虚假唤醒

要不要加容量限制?

如果希望队列有上限(比如避免内存爆掉),可以扩展:

  • 加成员变量 size_t capacity_
  • push 前检查 queue_.size() ,不满足则 wait(cond_not_full_)
  • pop 后 notify cond_not_full_,表示空出位置
  • 注意 size() 在多线程下不是原子的——所以必须在锁内判断

更现代的选择:用 std::shared_mutex?

如果读远多于写(比如多个消费者只 pop,但只有一个生产者 push),可以用 std::shared_mutex 实现多读单写优化。不过标准 queue 的 pop 是修改操作,仍需独占锁;真正受益的是只读场景(如 size()、empty()),但通常这些调用本身开销小,优化意义不大。对绝大多数场景,std::mutex 已足够简洁高效。

基本上就这些。不需要自己造轮子,C++11 起的标准库原语完全够用,关键是把锁粒度、条件等待和移动语义用对。


# ai  # c++  # 标准库  # 为什么  # red  # 成员变量  # Lambda  # 泛型  # 线程  # 多线程  # 不支持  # 空出  # 中途  # 解锁  # 的是  # 是一个  # 是因为  # 就能  # 多个  # 不需要 


相关文章: 较简单的网站制作软件有哪些,手机版网页制作用什么软件?  如何快速生成专业多端适配建站电话?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  深圳 网站制作,深圳招聘网站哪个比较好一点啊?  网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?  5种Android数据存储方式汇总  建站主机选择指南:服务器配置与SEO优化实战技巧  c# Task.ConfigureAwait(true) 在什么场景下是必须的  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  如何通过.red域名打造高辨识度品牌网站?  制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  建站主机核心功能解析:服务器选择与网站搭建流程指南  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  ,sp开头的版面叫什么?  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  公司网站的制作公司,企业网站制作基本流程有哪些?  如何快速搭建响应式可视化网站?  如何在宝塔面板创建新站点?  建站VPS能否同时实现高效与安全翻墙?  建站之星如何保障用户数据免受黑客入侵?  建站之星ASP如何实现CMS高效搭建与安全管理?  南宁网站建设制作定制,南宁网站建设可以定制吗?  javascript中对象的定义、使用以及对象和原型链操作小结  如何做静态网页,sublimetext3.0制作静态网页?  如何快速搭建个人网站并优化SEO?  青岛网站建设如何选择本地服务器?  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  建站之星代理商如何保障技术支持与售后服务?  免费制作小说封面的网站有哪些,怎么接网站批量的封面单?  建站中国官网:模板定制+SEO优化+建站流程一站式指南  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  建站主机无法访问?如何排查域名与服务器问题  表情包在线制作网站免费,表情包怎么弄?  建站之星各版本价格是多少?  ,如何利用word制作宣传手册?  如何批量查询域名的建站时间记录?  如何在阿里云高效完成企业建站全流程?  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  深圳网站制作的公司有哪些,dido官方网站?  深圳网站制作案例,网页的相关名词有哪些?  如何选择网络建站服务器?高效建站必看指南  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  如何在景安服务器上快速搭建个人网站?  如何快速搭建虚拟主机网站?新手必看指南  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  如何在宝塔面板中修改默认建站目录?  如何高效利用亚马逊云主机搭建企业网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。