码迷,mamicode.com
首页 > 编程语言 > 详细

boost::lockfree::queue多线程读写实例

时间:2018-01-21 13:41:48      阅读:393      评论:0      收藏:0      [点我收藏+]

标签:worker   queue   tar   正是   names   code   上线   lock   lib   

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

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

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

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

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

#ifndef DYNAMIC_QUEUE_H_
#define DYNAMIC_QUEUE_H_
//boost::unique_lock<boost::shared_mutex> lock(mutex_);加锁,函数第一句话加上这个就行,函数运行完的时候,会自动析构掉的

#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多线程读写实例

标签:worker   queue   tar   正是   names   code   上线   lock   lib   

原文地址:https://www.cnblogs.com/qscqesze/p/8323777.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!