最近的任务是写一个多线程的东西,就得接触多线程队列了,我反正是没学过分布式的,代码全凭感觉写出来的,不过运气好,代码能够work= =

话不多说,直接给代码吧,一个多消费者,多生产者的模式。假设我的任务是求队列的中位数是啥,每消费10000次的时候,我要知道中位数是什么。

至于加不加锁,这个看你了,我反正是加了,代码里面没写……我反正是把写的代码单独封装了一个函数,然后加了个锁

欢迎交流,这个代码已经在实际任务上面上线了,希望不会有bug。

用的是boost::lockfree::queue,官方文档:http://www.boost.org/doc/libs/1_55_0/boost/lockfree/queue.hpp

/*
关于锁的代码:伟大的Boost库给我们提供了 shared_mutex  类,结合 unique_lock 与 shared_lock 的使用,可以实现读写锁。通常读写锁需要完成以下功能:1.当 data 被线程A读取时,其他线程仍可以进行读取却不能写入2.当 data 被线程A写入时,其他线程既不能读取也不能写入对应于功能1,2我们可以这样来描述:1.当线程A获得共享锁时,其他线程仍可以获得共享锁但不能获得独占锁2.当线程A获得独占锁时,其他线程既不能获得共享锁也不能获得独占锁typedef boost::shared_lock<boost::shared_mutex> read_lock;
typedef boost::unique_lock<boost::shared_mutex> write_lock;  boost::shared_mutex read_write_mutex;
int32_t data = 1;  //线程A,读data
{  read_lock rlock(read_write_mutex);  std::cout << data << std:; endl;
}  //线程B,读data
{  read_lock rlock(read_write_mutex);  std::cout << data << std:; endl;
}  //线程C,写data
{  write_lock rlock(read_write_mutex);  data = 2;
}
*/#ifndef DYNAMIC_QUEUE_H_
#define DYNAMIC_QUEUE_H_#include "boost/lockfree/queue.hpp"
#include "boost/thread/thread.hpp"
#include "boost/thread/mutex.hpp"
#include "abtest_parameters.h"namespace un {
class DynamicController {public:
boost::lockfree::queue<size_t,boost::lockfree::capacity<40000> > lockfree_queue;
// boost::lockfree::queue  boost里面的无锁队列,唯一比较蛋疼的就是空间最大65536以及没法输出size,其他的就将就用吧。
// 队列长度可以自定义,也可以不定义,会自增长的。size_t num = 0;void StartDaemonUpdater(){boost::function0<void> f = boost::bind(&DynamicController::UpdaterWorker, this);boost::thread thrd(f);thrd.detach();
}
// 启动消费者队列void Producer(size_t number){bool succ = lockfree_queue.bounded_push(number);// 如果用push的话,没空间的话,会等待消费完。// bounded_push的话,如果每空间会返回false,然后弃掉这个数。成功返回true
}
// 生产者size_t GetNumber(return num;
}
// get代码void UpdaterWorker(void){std::vector<size_t> V;while(1){//稳妥起见,这个while里面可以写个sleep以至于不需要一直在消费。size_t tmp_value;while(lockfree_queue.pop(tmp_value)){V.push_back(tmp_value);// 更新条件,10000个数// 用p99更新if(V.size()>10000){std::sort(V.begin(),V.end());num = V[size_t(V.size()*0.5)];V.clear();}}}
}// 消费者};
}
#endif

boost::lockfree::queue多线程读写实例相关推荐

  1. boost::lockfree::queue用法的测试程序

    boost::lockfree::queue用法的测试程序 实现功能 C++实现代码 实现功能 boost::lockfree::queue用法的测试程序 C++实现代码 #include <b ...

  2. python多线程爬虫实例-Python多线程在爬虫中的应用

    题记:作为测试工程师经常需要解决测试数据来源的问题,解决思路无非是三种:(1)直接从生产环境拷贝真实数据 (2)从互联网上爬取数据 (3)自己用脚本或者工具造数据.前段时间,为了获取更多的测试数据,笔 ...

  3. python多线程爬虫实例-Python3多线程爬虫实例讲解代码

    多线程概述 多线程使得程序内部可以分出多个线程来做多件事情,充分利用CPU空闲时间,提升处理效率.python提供了两个模块来实现多线程thread 和threading ,thread 有一些缺点, ...

  4. python 多线程读写文件_python多线程同步之文件读写控制

    本文实例为大家分享了python多线程同步之文件读写控制的具体代码,供大家参考,具体内容如下 1.实现文件读写的文件ltz_schedule_times.py #! /usr/bin/env pyth ...

  5. boost::lockfree::spsc_queue用法的测试程序

    boost::lockfree::spsc_queue用法的测试程序 实现功能 C++实现代码 实现功能 boost::lockfree::spsc_queue用法的测试程序 C++实现代码 #inc ...

  6. boost::lockfree::stack用法的测试程序

    boost::lockfree::stack用法的测试程序 实现功能 C++实现代码 实现功能 boost::lockfree::stack用法的测试程序 C++实现代码 #include <b ...

  7. boost::lockfree::detail::tagged_ptr用法的测试程序

    boost::lockfree::detail::tagged_ptr用法的测试程序 实现功能 C++实现代码 实现功能 boost::lockfree::detail::tagged_ptr用法的测 ...

  8. boost::graph模块实现读写graphml的测试程序

    boost::graph模块实现读写graphml的测试程序 实现功能 C++实现代码 实现功能 boost::graph模块实现读写graphml的测试程序 C++实现代码 #include < ...

  9. boost::graph模块实现读写graphviz的测试程序

    boost::graph模块实现读写graphviz的测试程序 实现功能 C++实现代码 实现功能 boost::graph模块实现读写graphviz的测试程序 C++实现代码 #include & ...

最新文章

  1. R语言画图功能到底有多厉害,看看就知道了
  2. Html5 Canvas 学习之路(一)
  3. tar 打包文件与解压文件
  4. 基于角色-功能-资源的权限控制模型的设计与实现-引子
  5. php能干哪些副业,做副业,在能干的基础上踏实肯干
  6. DB2一个嵌套循环的sql
  7. ad14 drc报错_AD怎么设置DRC检查常规检查项报错?
  8. Lua游戏客户端框架通用功能模块
  9. 3 linux禁用ssl_linux – Poodle:在服务器上禁用SSL V3真的是一个解决方案吗?
  10. 最新大麦网抢票脚本-Python实战
  11. Matery主题友联随机排列
  12. 如何扎实的学好ABAP?我的个人经验
  13. JAVA SE File下面的方法
  14. 如何用python做考勤_【python爬虫教程 考勤】如何用Python实现一只小爬虫,爬取拉勾网...
  15. protocol buffer编码原理,让你理解pb是如何实现的
  16. Android音乐播放器源码(歌词.均衡器.收藏.qq5.0菜单.通知)
  17. 怎样设计一个管理系统
  18. 15分钟分析伦敦银今日走势
  19. ceph集群节点扩容osd,rgw,mon,mgr
  20. 【Lorenz】基于MATLAB的lorenz混沌序列产生器

热门文章

  1. openssh升级_Redhat 6.5源码编译升级openssh到7.8版本
  2. jar 工程我怎么在网页上url访问某一个方法_Java高级编程之URL处理
  3. richtextbox自动滚动到最下面_Axure RP 9教程:banner轮播最简单的实现方法
  4. 数据库设计三大范式应用实例剖析(讲得比较清楚)
  5. 大数据学习笔记:Hadoop生态系统
  6. 每个人都该知道的数字
  7. 《天天数学》连载23:一月二十三日
  8. 【BZOJ28431180】极地旅行社,LCT练习
  9. 【BZOJ4034】T2,树链剖分练习
  10. 【BZOJ2818】Gcd,数论练习之欧拉筛