全网整合营销服务商

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

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

C++如何实现一个阻塞队列_C++11使用条件变量和互斥锁实现线程安全队列

阻塞队列通过互斥锁和条件变量实现线程安全的共享数据,使用wait避免虚假唤醒,notify及时通知对方线程,确保生产者和消费者在队列满或空时正确阻塞与唤醒。

在多线程编程中,线程之间经常需要安全地共享数据。阻塞队列是一种常见的线程同步机制,当队列为空时,消费者线程会被阻塞,直到生产者放入新元素;当队列满时,生产者也会被阻塞,直到有空间可用。C++11 提供了 std::mutexstd::condition_variable 来实现这一功能。

基本原理

阻塞队列的核心是保护共享资源(如 std::queue)不被多个线程同时访问。通过互斥锁保证原子性,条件变量用于线程间通信:

  • 使用 std::unique_lock<:mutex> 管理锁的生命周期
  • 使用 std::condition_variable::wait() 让线程等待特定条件成立
  • 使用 notify_one()notify_all() 唤醒等待中的线程

实现一个简单的阻塞队列

下面是一个固定容量的阻塞队列模板实现:

#include 
#include 
#include 
#include 

template 
class BlockingQueue {
private:
    std::queue data_queue_;
    std::mutex mtx_;
    std::condition_variable not_full_;
    std::condition_variable not_empty_;
    size_t capacity_;

public:
    explicit BlockingQueue(size_t cap = 1000) : capacity_(cap) {}

    void put(const T& item) {
        std::unique_lock lock(mtx_);
        // 等待队列不满
        not_full_.wait(lock, [this] { return data_queue_.size() < capacity_; });
        data_queue_.push(item);
        not_empty_.notify_one(); // 通知消费者
    }

    void take(T& item) {
        std::unique_lock lock(mtx_);
        // 等待队列不空
        not_empty_.wait(lock, [this] { return !data_queue_.empty(); });
        item = data_queue_.front();
        data_queue_.pop();
        not_full_.notify_one(); // 通知生产者
    }

    bool empty() const {
        std::lock_guard lock(mtx_);
        return data_queue_.empty();
    }

    size_t size() const {
        std::lock_guard lock(mtx_);
        return data_queue_.size();
    }
};

使用示例

启动一个生产者和一个消费者线程进行测试:

#include 
#include 

int main() {
    BlockingQueue queue(5);

    auto producer = [&]() {
        for (int i = 0; i < 10; ++i) {
            queue.put(i);
            std::cout << "Produced: " << i << "\n";
            std::this_thread::sleep_for(std::chrono::milliseconds(100));
        }
    };

    auto consumer = [&]() {
        int value;
        for (int i = 0; i < 10; ++i) {
            queue.take(value);
            std::cout << "Consumed: " << value << "\n";
        }
    };

    std::thread t1(producer);
    std::thread t2(consumer);

    t1.join();
    t2.join();

    return 0;
}

关键点说明

阻塞队列实现中几个重要细节:

  • wait 的用法:传入 lambda 表达式作为谓词,避免虚假唤醒问题
  • notify 的时机:每次 pop 后通知 not_full_,每次 push 后通知 not_empty_
  • 锁的粒度:尽量缩小临界区,只在访问共享队列时加锁
  • 异常安全:使用 RAII 类型的锁管理对象(如 unique_lock)
基本上就这些。这种模式广泛应用于任务调度、生产者-消费者系统等场景。


# c++  # ai  # ios  # stream  # 同步机制  # Lambda  # 线程  # 多线程  # 对象  # 是一个  # 几个  # 这一  # 是一种  # 也会  # 互斥  # 多个  # 只在  # 应用于  # 不被 


相关文章: 定制建站如何定义?其核心优势是什么?  如何通过虚拟主机空间快速建站?  如何在Golang中指定模块版本_使用go.mod控制版本号  如何在宝塔面板创建新站点?  ,网站推广常用方法?  如何确认建站备案号应放置的具体位置?  宁波自助建站系统如何快速打造专业企业网站?  兔展官网 在线制作,怎样制作微信请帖?  *服务器网站为何频现安全漏洞?  Swift中循环语句中的转移语句 break 和 continue  如何在IIS管理器中快速创建并配置网站?  网站制作价目表怎么做,珍爱网婚介费用多少?  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  如何用wdcp快速搭建高效网站?  广州建站公司哪家好?十大优质服务商推荐  如何在腾讯云服务器快速搭建个人网站?  如何在企业微信快速生成手机电脑官网?  佛山企业网站制作公司有哪些,沟通100网上服务官网?  免费视频制作网站,更新又快又好的免费电影网站?  建站主机是什么?如何选择适合的建站主机?  制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?  智能起名网站制作软件有哪些,制作logo的软件?  网站制作多少钱一个,建一个论坛网站大约需要多少钱?  如何高效利用亚马逊云主机搭建企业网站?  陕西网站制作公司有哪些,陕西凌云电器有限公司官网?  seo网站制作优化,网站SEO优化步骤有哪些?  招商网站制作流程,网站招商广告语?  如何快速查询域名建站关键信息?  建站之星下载版如何获取与安装?  北京网站制作网页,网站升级改版需要多久?  如何在西部数码注册域名并快速搭建网站?  沈阳制作网站公司排名,沈阳装饰协会官方网站?  建站主机选哪种环境更利于SEO优化?  潍坊网站制作公司有哪些,潍坊哪家招聘网站好?  建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略  如何配置WinSCP新建站点的密钥验证步骤?  学校建站服务器如何选型才能满足性能需求?  宝塔建站助手安装配置与建站模板使用全流程解析  ,有什么在线背英语单词效率比较高的网站?  建站之星安装提示数据库无法连接如何解决?  在线制作视频的网站有哪些,电脑如何制作视频短片?  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  湖州网站制作公司有哪些,浙江中蓝新能源公司官网?  建站之星如何快速生成多端适配网站?  实惠建站价格推荐:2025年高性价比自助建站套餐解析  Swift中switch语句区间和元组模式匹配  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  如何通过建站之星自助学习解决操作问题?  c# 在高并发场景下,委托和接口调用的性能对比  宁波免费建站如何选择可靠模板与平台? 

您的项目需求

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