您的位置:首页 > 产品设计 > UI/UE

学习笔记:改进的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]






                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: