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

    #include <boost/thread/thread.hpp> #include <boost/lockfree/queue.hpp> #include <iost ...

  2. Boost lockfree deque 生产者与消费者多对多线程应用

    boost库中有一个boost::lockfree::queue类型的 队列,对于一般的需要队列的程序,其效率都算不错的了,下面使用一个用例来说明. 程序是一个典型的生产者与消费者的关系,都可以使用多 ...

  3. boost::lockfree::spsc_queue

    #include <boost/thread/thread.hpp> #include <boost/lockfree/spsc_queue.hpp> #include < ...

  4. 为什么多线程读写 shared_ptr 要加锁?

    https://www.cnblogs.com/Solstice/archive/2013/01/28/2879366.html 为什么多线程读写 shared_ptr 要加锁? 陈硕(giantch ...

  5. (转) C#多线程赛跑实例

    专于:http://blog.csdn.net/lidatgb/article/details/8363035 结合上篇<多线程的基础>,这次我们写一个多线程的赛跑实例,内容很简单:超人和 ...

  6. SQLite多线程读写实践及常见问题总结

    多线程读写 SQLite实质上是将数据写入一个文件,通常情况下,在应用的包名下面都能找到xxx.db的文件,拥有root权限的手机,可以通过adb shell,看到data/data/packagen ...

  7. (十一)boost库之多线程间通信

    (十一)boost库之多线程间通信 1.互斥锁 在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性.每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一 ...

  8. 多线程读写shared_ptrshared_ptr要加锁分析!学习笔记

     (shared_ptr)的引用计数本身是安全且无锁的,但对象的读写则不是,“因为 shared_ptr 有两个数据成员,读写操作不能原子化".使得多线程读写同一个 shared_ptr 对 ...

  9. NFC读写实例

    package com.sy.nfc.test; import java.io.IOException; import android.nfc.NdefMessage; import android. ...

随机推荐

  1. Linux使用退格键时出现^H ^?解决方法

    Linux使用退格键时出现^H ^?解决方法 在linux下执行脚本不注意输错内容需要删除时总是出现^H ^H不是H键的意思,是backspace.主要是当你的终端backspace有问题的时候才需要 ...

  2. [转] 2016 JavaScript 发展现状大调查

    有人认为JavaScript是最好的语言,有人认为它一团糟.可按照C++之父的话来讲: 世界上只有两种编程语言:一种是天天被人喷的,另一种是没人用的. 不论你喜欢承认与否,JavaScript已经一天 ...

  3. [转] Lodash常用API笔记

    原生用法 直接使用的API _.reject 根据条件去除某个元素. var foo = [ {id: 0, name: "aaa", age: 33}, {id: 1, name ...

  4. sharepoint2013 Restore-SPSite 报错,采用数据库还原

    PS C:\Users\spadmin> Restore-SPSite http://hz0xw002049:8099 -Path D:\20170731MossSiteSP.bak -Forc ...

  5. js条件语句初步练习

    var a=18            if(a<10){                alert("便宜")            }            else{  ...

  6. 2016-06-18 exshop第四天

    昨天本来想完成用asset-pipeline替换掉resource插件的工作,但由于进行了对spring security插件的文档解读,同时面试了4个人,每个人耗费了30分钟,并且公司下午4:30组 ...

  7. 高性能之js

    alloyteam团队的总结: 链接在:http://www.alloyteam.com/2012/10/high-performance-front-end-high-performance-jav ...

  8. python--模拟蜂窝网(https)登陆总结

    #用户名密码登陆 1.寻找登陆请求(此处可以故意输错用户名密码,目的是为了能够看清楚重定向的地址) 发现: 点击登陆时,请求了 ①.post302:https://passport.mafengwo. ...

  9. 用greenlet实现协程消费者生产者

    代码: from greenlet import greenlet import random def pro(): 生产者 while True: item = random.randint(0,9 ...

  10. TF:Tensorflow定义变量+常量,实现输出计数功能—Jason niu

    #TF:Tensorflow定义变量+常量,实现输出计数功能 import tensorflow as tf state = tf.Variable(0, name='Parameter_name_c ...