上次的修改一下
链接在此:[无锁队列一]
//c_buffer.h
class c_data
{
private:
s_memory v_root = NULL;
s_memory *v_r = NULL;
s_memory *v_w = NULL;
int v_num = 0;
public:
~c_data()
{
s_memory_block * pos = v_root.v_next;
int num = 0;
while (1) {
int flag = pos->flag;
s_memory_block * tmp = pos->v_next;
delete pos;
pos = tmp;
if (++num == v_num) //cycle must be out
break;
}
}
int func_mem_create(int pagesize, int num = 200)
{
s_memory_block * pos = NULL;
s_memory_block * smb = new s_memory_block(pagesize);
v_root.v_next = smb; //the first
smb->flag = 0;
pos = smb;
for (int i = 1; i flag = i;
pos->v_next = smb;
pos = smb;
}
pos->v_next = v_root.v_next;
v_w = &v_root;
v_r = &v_root;
v_num = num;
return 0;
}
s_memory *func_mem_write_get()
{
while (1)
{
char m = v_w->v_next->v_lock.load(std::memory_order_relaxed);
if(m != en_read)
{
size_t pack_num = v_w->v_pack_num;
v_w = v_w->v_next;
v_w->v_lock.store(en_write, std::memory_order_relaxed);
//v_w->v_lock = en_write;
v_w->v_pack_num = pack_num +1;
return v_w;
}
else {
//give up the left cpu time let read to do what to do
std::this_thread::yield();
}
}
}
//this function will end the memory barriar
void func_mem_write_fin(s_memory * w)
{
w->v_lock = en_middle;
}
s_memory * func_mem_read_get()
{
char m = v_r->v_next->v_lock.load(std::memory_order_relaxed);
if (m == en_middle)//en_middle can read , en_write can not read
{
v_r->v_next->v_lock = en_read;
v_r = v_r->v_next;
return v_r;
}
return NULL;
}
void func_mem_read_fin(s_memory *r)
{
r->v_lock.store(en_middle, std::memory_order_relaxed);
}
};
测试:
#include "c_buffer.h"
#include
using namespace std;
int main()
{
c_data mdata;
mdata.func_mem_create(M_MTU);
#if 1
std::thread thd([&mdata]() {
for (;;)
{
s_memory * r = mdata.func_mem_read_get();
//this is the exit condition
if (r && r->v_pack_num == 999)
{
cout
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?