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

温州模板网站建站河南网站建设哪个公司做得好

温州模板网站建站,河南网站建设哪个公司做得好,河北省网站备案系统,网站建设要学哪些方面个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言如何实现一个线程安全的队列思路应用场景代码实现总结 前言 在一次和豆包的模拟面试中,豆包问我:“在C中&#xf…

在这里插入图片描述

个人主页 : 个人主页
个人专栏 : 《数据结构》 《C语言》《C++》《Linux》《网络》 《redis学习笔记》

文章目录

  • 前言
  • 如何实现一个线程安全的队列思路
  • 应用场景
  • 代码实现
  • 总结


前言

在这里插入图片描述
在一次和豆包的模拟面试中,豆包问我:“在C++中,如何实现一个线程安全的队列呢?”


根据C++标准,STL容器的线程安全性遵循以下规则:

  • 只读操作是线程安全的:多个线程可以同时调用const 成员函数(如size, empty, at等)读取同一个容器,只要没有线程修改容器
  • 写操作需要独占访问:如果至少有一个线程在修改容器(如push_back, earse, operator[]等),其它线程必须通过同步机制,来保护对该容器的访问
  • 不同容器实例独立:不同线程操作不同的容器实例。

但如果多个线程同时修改同一个容器,或一个线程修改,另一个线程读取都是线程不安全的

在这里插入图片描述


如何实现一个线程安全的队列思路

实现步骤:

  1. 使用std::queue作为底层容器
  2. 使用std::mutex保护队列的访问
  3. 使用std::condition_variable协调线程,特别是在队列空时等待
  4. 在push时获取锁,添加元素后通知一个等待的线程
  5. 在pop时,使用while循环等待队列非空,处理虚假唤醒
  6. 提供tryPop和waitAndPop等不同方法,以适用不同场景
  7. 考虑异常安全,使用lock_guard或unique_lock管理锁的声明周期

在C++中实现线程安全队列的核心就在于通过同步机制保护共享数据的访问,并协调生产者和消费者线程操作


应用场景

  • 生产者-消费者模型:多个生产者线程向队列添加任务,消费者线程处理任务
  • 线程池任务队列:线程池使用线程安全的队列分发任务,支持异步返回值(std::future)
  • 事件驱动系统:管理异步事件,确保按顺序处理回调

代码实现

#include <queue>
#include <mutex>
#include <condition_variable>template <typename T>
class ThreadSafeQueue {
public:// 入队操作// 获取锁后添加元素,并通知一个等待线程void push(T value) {std::lock_guard<std::mutex> lock(_mtx);if(_finish)  return ;_data_queue.push(value);_cv.notify_one();};// 非阻塞出队// 立即尝试获取元素,若队列为空则返回失败bool tryPop(T& value) {std::lock_guard<std::mutex> lock(_mtx);if(_data_queue.empty() || _finish)return false;   // 队列为空 or 终止符为truevalue = _data_queue.front();_data_queue.pop();return true;};// 阻塞出队// 等待队列非空后获取元素,处理虚假唤醒void waitAndPop(T& value) {std::lock_guard<std::mutex> lock(_mtx);_cv.wait(lock, [this](){return !_data_queue.empty() || _finish;});if(finish)return ;value = _data_queue.front();_data_queue.pop();return ;};// 终止队列// 设置终止标志并唤醒所有线程void finish() {std::lock_guard<std::mutex> lock(_mtx);_finish = true;_cv.notify_all();};// 判断队列是否为空bool empty() const {std::lock_guard<std::mutex> lock(_mtx);return _data_queue.empty();};// 获取队列元素个数int size()  {std::lock_guard<std::mutex> lock(_mtx);return _data_queue.size();}
private:std::queue<T> _data_queue;       // 底层容器就是queuestd::mutex _mtx;                 // 互斥锁std::condition_variable _cv;     // 信号量 bool _finish = false;            // 终止标志
};

在这里插入图片描述


总结

以上就是我总结的在C++中如何实现线程安全的队列

在这里插入图片描述

http://www.dtcms.com/wzjs/358383.html

相关文章:

  • 上海广告牌制作公司临沂seo
  • 做网站 赚钱东莞网站开发公司
  • 微商怎么做网站搜索引擎推广的费用
  • 广州白云做网站网站怎么才能被百度收录
  • 租用网站如何制作网页产品推广思路
  • 网站备案密码格式百度网
  • 国内投资咨询网站 html模板西安网站建设公司
  • 都昌县建设局网站网络营销推广合作
  • 网站开发外贸网站的优化与推广分析
  • 网站公司怎么做的小红书怎么做关键词排名优化
  • 网站建设行情谷歌搜索引擎在线
  • 常州做网站的重庆百度推广开户
  • 公司做seo网站山西seo推广
  • 在线旅游网站建设方案网店如何营销推广
  • 怎么查询网站真假备案网站提交收录软件
  • 上海软件app开发流程深圳做seo有哪些公司
  • 哪个网站做二手车买卖chrome浏览器
  • 东莞做网站it s竞价托管外包费用
  • 做动图的网站郭生b如何优化网站
  • 一级a做爰片免费网站国产网站建设优化推广系统
  • 公司网站的建设内容怎么写网上商城网站开发
  • 网站开发项目广州网站建设费用
  • 做网站时点击显示二维码引流推广的平台
  • 太原市免费网站建设中国站长网站
  • ps怎么做电商网站太原免费网站建站模板
  • 怎么样再自己的网站做二级域名推广引流平台
  • 美团网站建设总体需求与目标免费的关键词优化工具
  • 武汉做网站的公司排名百度搜索引擎盘搜搜
  • 做网站要源码吗热门关键词
  • 百度网站怎么做的赚钱吗百度怎么推广网站