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

app网站建设教程视频wordpress tag列表页面

app网站建设教程视频,wordpress tag列表页面,贵州遵义企业公司网站建设,icp备案 网站名称个人主页 : 个人主页 个人专栏 : 《数据结构》 《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/a/471809.html

相关文章:

  • 查不到备案的网站wordpress怎么备份按在
  • 泉州网站制作运营商专业湘潭网站定制
  • 北京制作网站的公司简介交互网站是什么
  • 链表和数组
  • 做美食介绍的网站设计公司logo免费
  • 佛山网站建设十年乐云seowordpress 注册 地址
  • 网站设计与规划找人做网站应该注意什么
  • 企业网站的功能有哪些昆明网站建设推荐力鼎科技
  • Vue定义全局弹窗组件,使其在满足某种条件情况下弹出
  • 开发文档规范
  • 合肥 电子商务 网站推广wordpress 循环两个交替
  • 12306网站哪个公司做的wordpress 3.9 编辑文章 固定链接 不能编辑
  • 网站方案设计做不做生意都要知道的网站
  • 频率在空间上的投射
  • 网站建设的相关知识c 网站开发简单实例
  • 【避坑】键值存储分解技术的局限性
  • 瑞丽企业网站建设各网站封面尺寸
  • 企业网站建站系统网站建设与网页设计课程
  • 毕设做网站怎么弄代码设计工商注册网站
  • 为什么进不了中国建设银行网站wordpress 插件经验
  • 嵌入式学习笔记6.PWM
  • 成都网站建设四川推来客网络手表网站 源码
  • 大型大型网站建设方案ppt大连网站建设动态
  • 网站的推广运营wordpress建设
  • 山东住房建设部网站在线p图网页
  • 哪里需要人做钓鱼网站维力安网站建设公司
  • 备案的网站必须打开吗seo是什么意思揉若湖南岚鸿专注
  • 湖南长信建设集团网站wordpress 怎么改中文字体
  • Kafka11-知识补充
  • 印象网站建设苏州制作网站的有几家