当前位置: 首页 > news >正文

C++ 并发专题 - 实现一个线程安全的队列

一:概述

        本文利用 C++ 标准库中的多线程、条件变量、互斥锁等工具来实现一个线程安全的队列,并且使用多个线程来向队列中添加和获取数据。 

二:实现过程:

#include <iostream>
#include <queue>
#include <mutex>
#include <condition_variable>
#include <thread>
#include <vector>template <typename T>
class ThreadSafeQueue {
public:// 向队列中添加元素void push(const T& value) {std::lock_guard<std::mutex> lock(mutex_);queue_.push(value);cond_var_.notify_one();  // 通知一个等待的线程}// 从队列中取出元素,如果队列为空,阻塞等待T pop() {std::unique_lock<std::mutex> lock(mutex_);cond_var_.wait(lock, [this] { return !queue_.empty(); });  // 等待直到队列非空T value = queue_.front();queue_.pop();return value;}// 判断队列是否为空bool empty() const {std::lock_guard<std::mutex> lock(mutex_);return queue_.empty();}private:mutable std::mutex mutex_;            // 互斥锁,保护队列std::queue<T> queue_;                 // 基础队列std::condition_variable cond_var_;   // 条件变量,用于队列为空时的等待
};// 示例:使用线程安全队列
void producer(ThreadSafeQueue<int>& queue, int numItems) {for (int i = 0; i < numItems; ++i) {queue.push(i);std::cout << "Produced: " << i << std::endl;}
}void consumer(ThreadSafeQueue<int>& queue, int numItems) {for (int i = 0; i < numItems; ++i) {int item = queue.pop();std::cout << "Consumed: " << item << std::endl;}
}int main() {ThreadSafeQueue<int> queue;const int numItems = 10;const int numProducers = 2;const int numConsumers = 2;std::vector<std::thread> threads;// 启动生产者线程for (int i = 0; i < numProducers; ++i) {threads.push_back(std::thread(producer, std::ref(queue), numItems / numProducers));}// 启动消费者线程for (int i = 0; i < numConsumers; ++i) {threads.push_back(std::thread(consumer, std::ref(queue), numItems / numConsumers));}// 等待所有线程完成for (auto& thr : threads) {thr.join();}return 0;
}

http://www.lryc.cn/news/511316.html

相关文章:

  • SQL 基础教程
  • 【源码】Sharding-JDBC源码分析之SQL中影子库ShadowSQLRouter路由的原理
  • 雷池 WAF 搭配阿里云 CDN 使用教程
  • 3.银河麒麟V10 离线安装Nginx
  • 【模块一】kubernetes容器编排进阶实战之kubernetes 资源限制
  • 【开源】一款基于SpringBoot的智慧小区物业管理系统
  • Goland:专为Go语言设计的高效IDE
  • 云手机与Temu矩阵:跨境电商运营新引擎
  • 仓颉编程笔记1:变量函数定义,常用关键字,实际编写示例
  • Python小括号( )、中括号[ ]和大括号{}代表什么
  • React里使用lodash工具库
  • 【免费分享】mysql笔记,涵盖查询、缓存、存储过程、索引,优化。
  • C语言-数据结构-图
  • android sqlite 数据库简单封装示例(java)
  • “宠物服务的跨平台整合”:多设备宠物服务平台的实现
  • 关于最新MySQL9.0.1版本zip自配(通用)版下载、安装、环境配置
  • 【Halcon】例程讲解:基于形状匹配与OCR的多图像处理(附图像、程序下载链接)
  • B站推荐模型数据流的一致性架构
  • 不安全物联网的轻量级加密:综述
  • mysql_init的概念和使用案例
  • 3GPP R18 MT-SDT
  • 时频转换 | Matlab暂态提取变换transient-extracting transform一维数据转二维图像方法
  • .NET Framework 逐渐过时,.NET 8和 .NET 9引领未来
  • 从虚拟到现实:AI与AR/VR技术如何改变体验经济?
  • 在K8S中,Ingress该如何使用?
  • Ubuntu24.04安装NVIDIA驱动及工具包
  • 【每日学点鸿蒙知识】组件封装通用方法、callback和await性能对比、Web组件下拉刷新、hsp包报错、WebView圆角
  • Excel批量设置行高,Excel表格设置自动换行后打印显示不全,Excel表格设置最合适的行高后打印显示不全,完美解决方案!!!
  • Web Bluetooth API 开发记录
  • python基础知识(二)