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

[复制链接]
发表于 2025-11-18 10:14:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
一:概述

        本文使用 C++ 标准库中的多线程、条件变量、互斥锁等工具来实现一个线程安全的队列,而且使用多个线程来向队列中添加和获取数据。 
二:实现过程:
  1. #include <iostream>
  2. #include <queue>
  3. #include <mutex>
  4. #include <condition_variable>
  5. #include <thread>
  6. #include <vector>
  7. template <typename T>
  8. class ThreadSafeQueue {
  9. public:
  10.     // 向队列中添加元素
  11.     void push(const T& value) {
  12.         std::lock_guard<std::mutex> lock(mutex_);
  13.         queue_.push(value);
  14.         cond_var_.notify_one();  // 通知一个等待的线程
  15.     }
  16.     // 从队列中取出元素,如果队列为空,阻塞等待
  17.     T pop() {
  18.         std::unique_lock<std::mutex> lock(mutex_);
  19.         cond_var_.wait(lock, [this] { return !queue_.empty(); });  // 等待直到队列非空
  20.         T value = queue_.front();
  21.         queue_.pop();
  22.         return value;
  23.     }
  24.     // 判断队列是否为空
  25.     bool empty() const {
  26.         std::lock_guard<std::mutex> lock(mutex_);
  27.         return queue_.empty();
  28.     }
  29. private:
  30.     mutable std::mutex mutex_;            // 互斥锁,保护队列
  31.     std::queue<T> queue_;                 // 基础队列
  32.     std::condition_variable cond_var_;   // 条件变量,用于队列为空时的等待
  33. };
  34. // 示例:使用线程安全队列
  35. void producer(ThreadSafeQueue<int>& queue, int numItems) {
  36.     for (int i = 0; i < numItems; ++i) {
  37.         queue.push(i);
  38.         std::cout << "Produced: " << i << std::endl;
  39.     }
  40. }
  41. void consumer(ThreadSafeQueue<int>& queue, int numItems) {
  42.     for (int i = 0; i < numItems; ++i) {
  43.         int item = queue.pop();
  44.         std::cout << "Consumed: " << item << std::endl;
  45.     }
  46. }
  47. int main() {
  48.     ThreadSafeQueue<int> queue;
  49.     const int numItems = 10;
  50.     const int numProducers = 2;
  51.     const int numConsumers = 2;
  52.     std::vector<std::thread> threads;
  53.     // 启动生产者线程
  54.     for (int i = 0; i < numProducers; ++i) {
  55.         threads.push_back(std::thread(producer, std::ref(queue), numItems / numProducers));
  56.     }
  57.     // 启动消费者线程
  58.     for (int i = 0; i < numConsumers; ++i) {
  59.         threads.push_back(std::thread(consumer, std::ref(queue), numItems / numConsumers));
  60.     }
  61.     // 等待所有线程完成
  62.     for (auto& thr : threads) {
  63.         thr.join();
  64.     }
  65.     return 0;
  66. }
复制代码

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表