当前位置: 首页 > 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;
}
http://www.lryc.cn/news/447720.html

相关文章:

  • 基于Hexo个人博客界面优化
  • vue3+ts不能将类型“Timeout”分配给类型“null”不能将类型“Timeout”分配给类型number
  • 如何给多台Linux机器设置时间同步
  • 忘写return有什么现象?
  • 大数据新视界 --大数据大厂之 Druid 实时数据分析平台在大数据中的应用
  • MySQL --基本查询(下)
  • vue3实现自定义主题色切换功能
  • 不懂性能测试,被面试官挂了...
  • JS逆向基础-谷歌浏览器调试技巧(详细)
  • 那年我双手插兜,使用IPv6+DDNS动态域名解析访问NAS
  • CSS的弹性盒子模型(Flex box)
  • django drf 分页器
  • SpringBoot整合JPA实现CRUD详解
  • 干部画像——精准辅助干部选拔的核心利器
  • linux网络编程9
  • RabbitMQ应用
  • 大数据Flink(一百二十四):案例实践——淘宝母婴数据加速查询
  • 无限大薄板的电场
  • 外包干了1个多月,技术明显退步了。。。。。
  • 芝法酱学习笔记(0.4)——SpringBoot多模块项目打包,resource分离,lib分离,启动脚本
  • 进程(一万字学习笔记)
  • Docker实践与应用:深度探索与丰富案例
  • 信息安全工程师(21)安全协议
  • Starrocks with 嵌套
  • ubuntu 安装neo4j
  • 云计算课程作业1
  • 建筑智能,推动智慧社区发展
  • conda 虚拟环境安装GDAL
  • STM32转AT32代码转换
  • vue中怎么覆盖 sytle中的样式