学习笔记:改进的waitfree_queue,增加了freelist功能
2014-09-27 16:55
204 查看
#include <atomic> #include <thread> #include <chrono> #include <vector> #include <iostream> #include <algorithm> #include <cassert> using namespace std; template<typename T> class waitfree_queue { public: waitfree_queue() : datalist_(0),freelist_(0){} //链表项 struct node { T data; node * next; }; //插入数据 void push(const T &data) { //从内存池中分配一个 node * n = alloc(); //拷贝数据 n->data = data; //放入队列 node * stale_head = datalist_.load(memory_order_relaxed); do { n->next = stale_head; } while (!datalist_.compare_exchange_weak(stale_head, n, memory_order_release)); } //一次提取一批数据,后插入的数据在链表的前面,先插入的在链表后面。 node * pop_all(void) { return datalist_.exchange(0, memory_order_consume); } private: node* alloc(){ //读取freelist_链表的头(可能陈旧) node *stale_head = freelist_.load(memory_order_relaxed); node* new_head = 0; do { if (stale_head==0){ node* n = new node; n->next=0; return n; } new_head = stale_head->next; } while (!freelist_.compare_exchange_weak(stale_head, new_head, memory_order_release)); } void free(node* n){ //计算n链表的尾 node *tail=n; while(tail->next){ tail = tail->next; } //读取freelist_链表的头(可能陈旧) node *stale_head = freelist_.load(memory_order_relaxed); do { tail->next = stale_head; } while (!freelist_.compare_exchange_weak(stale_head, n, memory_order_release)); } private: atomic<node*> datalist_ ; //数据传送的队列 atomic<node*> freelist_ ; //预分配的内存池 }; waitfree_queue<int> g_queue; int done=0; atomic<int> g_sum; void foo_imp(){ // pop elements waitfree_queue<int>::node *head = g_queue.pop_all(); if (head==0){ std::this_thread::sleep_for(std::chrono::milliseconds(1)); return; } waitfree_queue<int>::node *ite = head; while(ite) { g_sum+=1; ite = ite->next; } free(head); } void foo(){ do{ foo_imp(); } while(!done); std::this_thread::sleep_for(std::chrono::seconds(1)); foo_imp(); } void bar(){ for(int j=0;j<1000;++j){ for (int i=0;i<1000;++i){ g_queue.push(1); } std::this_thread::sleep_for(std::chrono::milliseconds(1)); } done=1; } int main(){ thread t0(&foo); thread t1(&foo); thread t2(&bar); thread t3(&bar); t3.join(); t1.join(); t2.join(); t0.join(); cout<<"OK"<<endl; return 0; }
[/code]
相关文章推荐
- 学习笔记:改进的waitfree_queue,排除一些bug
- SpringMVC + Spring + MyBatis 学习笔记:为MyBatis增加打印SQL功能 (最简化配置)
- [转]oracle学习笔记一:pctfree、pctused and freelist
- Java学习笔记(2)----散列集/线性表/队列/集合/图(Set,List,Queue,Collection,Map)
- SharePoint【学习笔记】-- SharePoint 2010 启用Form认证并增加用户注册功能
- Collection、List、Set、Map、Queue关系图学习笔记2
- ListBuffer、ArrayBuffer、Queue、Stack操作代码实战之Scala学习笔记-30
- 为FoxPro中的弹出式菜单增加自学习功能
- SNDCP学习笔记三(服务功能理解)
- 功能点分析 学习笔记 4
- 关于java打印功能的最简单实现的学习笔记
- MonoRail学习笔记六:Filter功能使用
- 孙鑫VC学习笔记:第十五讲 (三) 增加互斥条件实现线程同步
- 孙鑫VC学习笔记:第十五讲 增加互斥条件实现线程同步
- Linq学习笔记(1.6)——ToArray、ToList、ToDictionary、OfType
- NetTiers学习笔记03---NetTiers.v2.0至v2.1.0.560累计增加的一些内容
- MonoRail学习笔记五:定制服务实现自定义功能
- [ASP.NET学习笔记之五]ASP.NET 中的缓存功能介绍
- ATL学习笔记(3): QueryInterface功能的实现
- MonoRail学习笔记十四:分页功能的使用