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

boost 的lockfree 使用

boost 的lockfree 使用

// test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <mutex>
#include <memory>
#include <condition_variable>
#include <boost/lockfree/spsc_queue.hpp>
#include <boost/thread/thread.hpp>
#include <boost/atomic.hpp>
#include <thread>boost::atomic_int con_count(0);
boost::atomic_bool done(false);std::mutex pro_mtx;
std::condition_variable condition_producers;#include "c_mmu.h"
class TicToc
{
public:TicToc(){tic();}void tic(){start = std::chrono::system_clock::now();}double toc(){end = std::chrono::system_clock::now();std::chrono::duration<double> elapsed_seconds = end - start;start = end;return elapsed_seconds.count() * 1000;}private:std::chrono::time_point<std::chrono::system_clock> start, end;
};struct s_data
{uint8_t* data = NULL;size_t len = 0;s_data(const char* in){len = strlen(in);data = (uint8_t*)malloc(len+1);if (data == NULL)return;memcpy(data, in, len);data[len] = '\0';}~s_data(){if (data != NULL)free(data);}
};
typedef std::shared_ptr<s_data> ptr_s_data;
boost::lockfree::spsc_queue<ptr_s_data, boost::lockfree::capacity<100> > spsc_queue;
static int ncount = 0;#define lee_mill(x) std::this_thread::sleep_for(std::chrono::milliseconds(x))int main_()
{if (spsc_queue.is_lock_free())std::cout << "single producer, single consume" << std::endl;//1000 second;// 000TicToc tp;std::thread thread_producer([=,&tp]() {//every ten millonsecond to int insert_num = 0;for (;;){if (spsc_queue.write_available()){char buffer[128];sprintf(buffer, "this is test %d\n", insert_num);ptr_s_data obj = std::make_shared<s_data>(buffer);spsc_queue.push(obj);if (insert_num++ > 100000)break;//condition_producers.notify_one();}elseboost::this_thread::sleep(1);}std::cout << tp.toc()<< " the insert is over " << std::endl;/*	while (ncount != 1000000 - 1){condition_producers.notify_one();std::cout << "sleep" <<ncount<< std::endl;lee_mill(20);}done = 1;*/});std::thread thread_consume([]() {TicToc tc;while (!done){std::unique_lock<std::mutex> ul(pro_mtx);//condition_producers.wait(ul);// , [] {if (spsc_queue.read_available() > 0){ptr_s_data obj = nullptr;spsc_queue.pop(obj);ncount++;if (obj && obj->data != NULL){if ((ncount % 10000) == 0)std::cout << obj->data;}}elselee_mill(2);}std::cout << "left is " << spsc_queue.read_available() << std::endl;std::cout << tc.toc() << " consume is over" << std::endl;});thread_producer.join();done = true;thread_consume.join();std::cout << "消费的数目:" << con_count << std::endl;return 1;
}

相关文章:

  • OmniAns丨OPENAIGC开发者大赛高校组AI创作力奖
  • C++远端开发环境手动编译安装(centos7)
  • YOLOv7改进之MAE主干: 超强ConvNeXtV2 升级版结构,当MAE+YOLO卷积高效涨点
  • 7.字符串 Strings
  • PowerDesigner 16.5安装教程 + 轻松解决软件证书过期导致的无法使用问题
  • OpenSource - 开源日历库tui.calendar
  • 音视频入门基础:FLV专题(1)——FLV官方文档下载
  • Visual Studio 2022
  • 408算法题leetcode--第17天
  • 虚幻引擎UE5如何云渲染,教程来了
  • 环形链表的约瑟夫问题
  • Python精选200Tips:176-180
  • 在ESPnet使用Makefile安装PyTorch和相关依赖的详细教程
  • 嵌入式学习--LinuxDay04
  • Cadence23中的一些设置
  • hexo+github搭建个人博客
  • 【Amaple教程】5. 插件
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Apache的80端口被占用以及访问时报错403
  • AWS实战 - 利用IAM对S3做访问控制
  • ES6 学习笔记(一)let,const和解构赋值
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Java 多线程编程之:notify 和 wait 用法
  • java8 Stream Pipelines 浅析
  • Java教程_软件开发基础
  • Koa2 之文件上传下载
  • web标准化(下)
  • 动态魔术使用DBMS_SQL
  • 多线程事务回滚
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 后端_MYSQL
  • 简析gRPC client 连接管理
  • 将回调地狱按在地上摩擦的Promise
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 微信小程序:实现悬浮返回和分享按钮
  • 06-01 点餐小程序前台界面搭建
  • 2017年360最后一道编程题
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • # Java NIO(一)FileChannel
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (003)SlickEdit Unity的补全
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (4)STL算法之比较
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (四)Controller接口控制器详解(三)
  • (转)四层和七层负载均衡的区别
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • . ./ bash dash source 这五种执行shell脚本方式 区别