0

0

c++如何实现线程安全的队列_c++多线程安全队列的实现与思路

裘德小鎮的故事

裘德小鎮的故事

发布时间:2025-11-13 12:08:38

|

937人浏览过

|

来源于php中文网

原创

线程安全队列需保证多线程下push和pop操作的原子性与互斥性,通过std::mutex和std::condition_variable实现加锁与阻塞等待,避免数据竞争和资源浪费;典型实现封装std::queue,提供push、try_pop、wait_and_pop等方法,支持生产者-消费者模型,注意避免持有锁时执行耗时操作,可扩展超时机制或优化为无锁结构以提升性能。

c++如何实现线程安全的队列_c++多线程安全队列的实现与思路

线程安全队列的基本需求

在多线程环境中,多个线程可能同时向队列中添加或取出数据。如果不对操作加保护,会出现数据竞争、读写错乱甚至程序崩溃。实现一个线程安全的队列核心目标是:保证任意线程对队列的 push 和 pop 操作都是原子且互斥的,同时避免死锁和性能瓶颈

关键点包括使用互斥锁(std::mutex)保护共享数据,用条件变量(std::condition_variable)实现阻塞等待机制,让取数据的线程在队列为空时自动挂起,有新数据时再唤醒。

基于 std::queue 的线程安全封装

可以封装标准库中的 std::queue,加上互斥锁和条件变量,实现一个通用的线程安全队列。以下是典型实现:

立即学习C++免费学习笔记(深入)”;

#include 
#include 
#include 

template
class ThreadSafeQueue {
private:
    std::queue data_queue;
    mutable std::mutex mtx;
    std::condition_variable cv;

public:
    ThreadSafeQueue() = default;

    void push(T value) {
        std::lock_guard lock(mtx);
        data_queue.push(std::move(value));
        cv.notify_one();  // 唤醒一个等待的消费者
    }

    bool try_pop(T& value) {
        std::lock_guard lock(mtx);
        if (data_queue.empty()) {
            return false;
        }
        value = std::move(data_queue.front());
        data_queue.pop();
        return true;
    }

    void wait_and_pop(T& value) {
        std::unique_lock lock(mtx);
        cv.wait(lock, [this] { return !data_queue.empty(); });
        value = std::move(data_queue.front());
        data_queue.pop();
    }

    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();
    }
};

说明:

  • push():加锁后入队,调用 notify_one() 通知等待的线程。
  • try_pop():非阻塞尝试出队,返回布尔值表示是否成功。
  • wait_and_pop():阻塞直到队列非空,适合消费者线程使用。
  • empty() / size():查询状态,也需加锁防止读取过程中被修改。

使用示例与注意事项

下面是一个生产者-消费者模型的简单使用场景:

MallWWI新模式返利商城系统
MallWWI新模式返利商城系统

MallWWI新模式返利商城系统基于成熟的飞蛙商城系统程序框架,支持多数据库配合,精美的界面模板,人性化的操作体验,完备的订单流程,丰富的促销形式,适合搭建稳定、高效的电子商务平台。创造性的完美整合B2B\B2C\B2S\C2B\C2C\P2C\O2O\M2C\B2F等模式,引领“互联网+”理念,实现商家联盟体系下的线上线下全新整合销售方式,独创最流行的分红权返利与排队返钱卡功能。安全、稳定、结构

下载
#include 
#include 
#include 

ThreadSafeQueue queue;

void producer(int id) {
    for (int i = 0; i < 5; ++i) {
        queue.push(id * 10 + i);
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
    }
}

void consumer() {
    for (int i = 0; i < 10; ++i) {
        int value;
        queue.wait_and_pop(value);
        std::cout << "Consumed: " << value << std::endl;
    }
}

int main() {
    std::thread p1(producer, 1);
    std::thread p2(producer, 2);
    std::thread c1(consumer);

    p1.join();
    p2.join();
    c1.join();

    return 0;
}

注意:

  • 不要在持有锁的情况下执行耗时操作或调用用户定义的函数(如析构、拷贝构造),以防死锁或性能下降。
  • 若需支持多消费者,notify_all() 可唤醒所有等待线程,但可能造成“惊群效应”,一般用 notify_one() 更高效。
  • 可扩展加入超时弹出(wait_for/wait_until)功能,用于实现带超时的消费逻辑。

更高效的优化方向

上述实现简单可靠,但在高并发下可能成为性能瓶颈。进阶方案包括:

  • 使用无锁队列(lock-free queue),基于原子操作和 CAS 实现,但复杂度高。
  • 采用环形缓冲区(ring buffer)+ 双指针,适用于固定大小的高性能场景。
  • 分离读写锁,或使用细粒度锁提升并发度。

对于大多数应用,带互斥锁和条件变量的阻塞队列已足够高效且易于维护。

基本上就这些,不复杂但容易忽略细节。

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

472

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

109

2025.12.24

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

61

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

41

2025.12.31

视频文件格式
视频文件格式

本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

32

2025.12.31

不受国内限制的浏览器大全
不受国内限制的浏览器大全

想找真正自由、无限制的上网体验?本合集精选2025年最开放、隐私强、访问无阻的浏览器App,涵盖Tor、Brave、Via、X浏览器、Mullvad等高自由度工具。支持自定义搜索引擎、广告拦截、隐身模式及全球网站无障碍访问,部分更具备防追踪、去谷歌化、双内核切换等高级功能。无论日常浏览、隐私保护还是突破地域限制,总有一款适合你!

41

2025.12.31

出现404解决方法大全
出现404解决方法大全

本专题整合了404错误解决方法大全,阅读专题下面的文章了解更多详细内容。

198

2025.12.31

html5怎么播放视频
html5怎么播放视频

想让网页流畅播放视频?本合集详解HTML5视频播放核心方法!涵盖<video>标签基础用法、多格式兼容(MP4/WebM/OGV)、自定义播放控件、响应式适配及常见浏览器兼容问题解决方案。无需插件,纯前端实现高清视频嵌入,助你快速打造现代化网页视频体验。

9

2025.12.31

关闭win10系统自动更新教程大全
关闭win10系统自动更新教程大全

本专题整合了关闭win10系统自动更新教程大全,阅读专题下面的文章了解更多详细内容。

8

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号