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

Posted qscqesze

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了boost::lockfree::queue多线程读写实例相关的知识,希望对你有一定的参考价值。

最近的任务是写一个多线程的东西,就得接触多线程队列了,我反正是没学过分布式的,代码全凭感觉写出来的,不过运气好,代码能够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多线程读写实例的主要内容,如果未能解决你的问题,请参考以下文章

boost::lockfree::spsc_queue 忙等待策略。有阻塞弹出吗?

使用 sizeof(boost::lockfree::queue<std::string>) 时出错

boost::lockfree::函数队列?

使用 Boost 的 lockfree spsc_queue 时如何编译?

evpp性能测试: 对无锁队列boost::lockfree::queue和moodycamel::ConcurrentQueue做一个性能对比测试

evpp性能测试: 对无锁队列boost::lockfree::queue和moodycamel::ConcurrentQueue做一个性能对比测试