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

释放序列和同步

#include <iostream>
#include<thread>
#include<atomic>
#include<vector>
std::atomic<int>count(0);
std::vector<int>queue_data;
//如果存储操作被标记为memory_order_release、memory_order_acq_rel或memory_order_seq_cst,
// 加载操作被标记为memory_order_consume、memory_order_acquire或memory_order_seq_cst,
// 并且链中的每个操作都加载了前一个操作写入的值,那么这一连串的操作构成了一个释放序列。
// 链中的任何原子读 - 修改 - 写操作都可以有任何内存排序(甚至是memory_order_relaxed)//填充队列
void populate_queue_items() {unsigned const number_of_items = 100;queue_data.clear(); //每次填充队列时清空一下for (int i = 0; i < number_of_items; ++i) {queue_data.push_back(i);}count.store(number_of_items, std::memory_order_release); //使用release模式填充原子变量
}
void process_queue_items(const int& item_index) {std::cout << "获得数据:" << queue_data.at(item_index - 1) << "\n";std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
//消费数据
void consume_queue_items() {while (true) {int item_index;//使用acquire和上面的release同步,并且自身+1,这是一个释放操作、获取操作//count减到0为止,然后重新开始获得数据if ((item_index = count.fetch_sub(1, std::memory_order_acq_rel)) <= 0) { //多次释放、获取形成了一条释放获取链std::cout << "等待数据准备中……\n";std::this_thread::sleep_for(std::chrono::microseconds(1));std::thread t(populate_queue_items);t.detach();continue;}process_queue_items(item_index); //使用数据}
}
void Test() {std::thread t(consume_queue_items);t.join();
}
int main(){Test();return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 数据库高级操作:分类汇总与排序
  • 心电信号降噪前处理(MATLAB R2018)
  • swift开发用Alamofire的post发送proto序列化消息
  • LLM 研究方向(一): LLM Prompts--p-tuning、LoRA
  • NLP - 基于bert预训练模型的文本多分类示例
  • 盲盒抽卡机小程序:抽卡机的多样化发展
  • OpenCV中使用Canny算法在图像中查找边缘
  • C++中的多重继承和虚继承:横向继承、纵向继承和联合继承;虚继承
  • 后端工作之一:CrapApi —— API接口管理系统部署
  • 【服务器】在Linux查看运行的Python程序,并找到特定的Python程序
  • HW期间——应急响应
  • 什么是边缘计算?创造一个更快、更智慧、更互联的世界
  • Selenium 等待
  • 图像类别生成数字标签
  • C++基础篇(1)
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • angular组件开发
  • Codepen 每日精选(2018-3-25)
  • ES6系统学习----从Apollo Client看解构赋值
  • GraphQL学习过程应该是这样的
  • Laravel 菜鸟晋级之路
  • laravel 用artisan创建自己的模板
  • Python十分钟制作属于你自己的个性logo
  • Vue2 SSR 的优化之旅
  • 产品三维模型在线预览
  • - 概述 - 《设计模式(极简c++版)》
  • 离散点最小(凸)包围边界查找
  • 前端技术周刊 2019-01-14:客户端存储
  • 前端自动化解决方案
  • 入门到放弃node系列之Hello Word篇
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • AI算硅基生命吗,为什么?
  • (3)STL算法之搜索
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (计算机网络)物理层
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (十二)Flink Table API
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (游戏设计草稿) 《外卖员模拟器》 (3D 科幻 角色扮演 开放世界 AI VR)
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .form文件_SSM框架文件上传篇
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .NET成年了,然后呢?
  • .NET使用存储过程实现对数据库的增删改查
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @JsonFormat 和 @DateTimeFormat 的区别
  • [ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证