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

C++用条件变量实现线程安全的queue容器

#include <queue>
#include <memory>
#include <mutex>
#include <condition_variable>
template<typename T>
class threadsafe_queue
{
private:mutable std::mutex mut;  // 1 互斥量必须是可变的 std::queue<T> data_queue;std::condition_variable data_cond;
public:threadsafe_queue(){}threadsafe_queue(threadsafe_queue const& other){std::lock_guard<std::mutex> lk(other.mut);data_queue=other.data_queue;}void push(T new_value){std::lock_guard<std::mutex> lk(mut);data_queue.push(new_value);data_cond.notify_one();}void wait_and_pop(T& value){std::unique_lock<std::mutex> lk(mut);data_cond.wait(lk,[this]{return !data_queue.empty();});value=data_queue.front();data_queue.pop();}std::shared_ptr<T> wait_and_pop(){std::unique_lock<std::mutex> lk(mut);data_cond.wait(lk,[this]{return !data_queue.empty();});std::shared_ptr<T> res(std::make_shared<T>(data_queue.front()));data_queue.pop();return res;}bool try_pop(T& value){std::lock_guard<std::mutex> lk(mut);if(data_queue.empty())return false;value=data_queue.front();data_queue.pop();return true;}std::shared_ptr<T> try_pop(){std::lock_guard<std::mutex> lk(mut);if(data_queue.empty())return std::shared_ptr<T>();std::shared_ptr<T> res(std::make_shared<T>(data_queue.front()));data_queue.pop();return res;}bool empty() const{std::lock_guard<std::mutex> lk(mut);return data_queue.empty();}
};
http://www.lryc.cn/news/229853.html

相关文章:

  • EDA实验-----3-8译码器设计(QuartusII)
  • NFTScan | 11.06~11.12 NFT 市场热点汇总
  • 2022年12月 Python(五级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • 第三章 将对象映射到 XML - 使用列表或数组定义的属性
  • C/S架构学习之基于TCP的本地通信(客户机)
  • CCF 备忘
  • Spring Framework中的依赖注入:构造器注入 vs. Setter注入
  • Java学习之路 —— API篇
  • Windows下安装Anaconda5.3.1+Python3.8+TensorFlow2.13.0-CPU版本总结
  • DigitalVirt 日本 Lite VPS 测评
  • Ridgeline plot / 远山图 / 山脊图 怎么画?怎么优化?
  • 【STM32/FreeRTOS】SysTick定时器及FreeRTOS系统节拍
  • Vue3封装自定义指令+h()
  • 爆火的迅雷网盘推广,一手云盘app拉新推广渠道必备项目 学习资料
  • Jmeter 请求返回多字段 —— 传递登录接口!
  • es 7.0常用的命令
  • [文件读取]lanproxy 文件读取 (CVE-2021-3019)
  • 记录一种引起 CL.exe/ C++ 编译器无任何提示直接崩溃的问题
  • 【华为OD机试高分必刷题目】生理周期(C++-模拟迭代实现)
  • 【Vue】过滤器Filters
  • springcloud旅游网站源码
  • Unity中关于Lerp()方法的使用
  • 计算机毕业设计选题推荐-体育赛事微信小程序/安卓APP-项目实战
  • Android BottomSheetDialog中列表滑动冲突问题
  • sql查询查看数据库空间使用情况
  • 算法分析与设计考前冲刺 (算法基础、数据结构与STL、递归和分治、 动态规划、贪心算法、 回溯算法)
  • Spring Data JPA 实现集成实体对象数据库的创建、修改时间字段自动更新
  • Vue3集成json-editor-vue3
  • UML建模语言
  • centos7系统离线安装tcpdump抓包软件、使用教程