首页 > 编程语言 >C++一读一写无锁队列

C++一读一写无锁队列

时间:2023-06-26 17:23:41浏览次数:64  
标签:无锁 qnode struct C++ next front return 一写 rear

// 一读一写的无锁管道队列
template<class T>
class PipelineList
{
private:
    template<class T>
    struct qnode
    {
        struct qnode *next;
        T data;
    };

    struct qnode<T>* volatile m_front;
    struct qnode<T>* volatile m_rear;

    bool init()
    {
        m_front = m_rear = new qnode<T>;
        if (!m_front)
        {
            return false;
        }
        m_front->next = 0;
        return true;
    }
    void destroy()
    {
        while (m_front)
        {
            m_rear = m_front->next;
            delete m_front;
            m_front = m_rear;
        }
    }

public:
    PipelineList()
    {
        init();
    }
    ~PipelineList()
    {
        destroy();
    }
    bool empty()
    {
        return (m_front == m_rear);
    }
    bool push(const T& e)
    {
        struct qnode<T> *p = new qnode<T>;
        if (!p)
        {
            return false;
        }
        p->next = 0;
        m_rear->next = p;
        m_rear->data = e;
        m_rear = p;
        return true;
    }
    bool pop(T& e)
    {
        if (m_front == m_rear)
        {
            return false;
        }
        struct qnode<T> *p = m_front;
        e = p->data;
        m_front = p->next;
        delete p;
        return true;
    }
};

标签:无锁,qnode,struct,C++,next,front,return,一写,rear
From: https://www.cnblogs.com/arbboter/p/17506228.html

相关文章

  • c++ std::execution::par,std::execution::par_unseq
    #include<algorithm>#include<chrono>#include<cstdint>#include<execution>#include<iostream>#include<random>#include<vector>std::random_devicerd;std::mt19937_64mt{rd()};template<typenameT>......
  • 为什么 Keil 中C/C++选项要 define STM32F10X_LD/MD/HD
    原因1:配置相应的中断向量表 原因2:配置相应的寄存器  总结原因:因为所有的stm32f10x 系列的芯片都会用到stm32f10x.h 这个头文件,但是问题的所在是:每种芯片的配置不同(中断向量个数、寄存器个数等等)因此宏条件编译#if!defined 判断这个宏(这个宏就是STM32F10X_LD......
  • Linux搭建C++开发环境
    Linux搭建C++开发环境https://blog.csdn.net/weixin_44666217/article/details/127594532LinuxC/C++开发环境搭建https://blog.csdn.net/zcteo/article/details/117528089 ......
  • C/C++按位读取
    RinpoStk按位读取在C中无法直接按位读取,常见的方法是通过位运算获取每一位的数据。//获取B5第4位//(B5&(1<<5))>>5 10110101& 00010000;= 00010000//得到1采取共用体(联合)可以得到一个既可以按位读取,也可以按字节读取的数据类型union{struct{un......
  • 突击-C++
    C++完全支持面向对象的程序设计,包括面向对象开发的四大特性:封装:是将数据和方法组合在一起,对外部隐藏实现细节,只公开对外提供的接口。这样可以提高安全性、可靠性和灵活性。继承:是从已有类中派生出新类,新类具有已有类的属性和方法,并且可以扩展或修改这些属性和方法。这样可......
  • C++面试八股文:std::array如何实现编译器排序?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第25面:面试官:array熟悉吗?二师兄:你说的是原生数组还是std::array?面试官:你觉得两者有什么区别?二师兄:区别不是很大,原生数组(非动态数组)和std::array都在栈上开辟空间,初始化的时候需要提供数组长度,且长度不可改变。有一点区别的是,st......
  • C++面试八股文:std::array如何实现编译器排序?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第25面:面试官:array熟悉吗?二师兄:你说的是原生数组还是std::array?面试官:你觉得两者有什么区别?二师兄:区别不是很大,原生数组(非动态数组)和std::array都在栈上开辟空间,初始化的时候需要提供数组长度,且长度不可改变。有一点区别的是,std......
  • C++ 核心指南之资源管理(中)
    C++核心指南之资源管理(中)R.alloc:分配和释放R.10:避免使用malloc()/free()R.11:避免显式调用new/deleteR.12:显式资源分配的结果应立即给到资源管理对象R.13:在一条语句中,最多只能有一个显式资源分配R.14:避免使用[]参数,用span替代R.15:分配/释放操作要......
  • C++ 数据抽象
     数据抽象是指,只向外界提供关键信息,并隐藏其后台的实现细节,即只表现必要的信息而不呈现细节。数据抽象是一种依赖于接口和实现分离的编程(设计)技术。让我们举一个现实生活中的真实例子,比如一台电视机,您可以打开和关闭、切换频道、调整音量、添加外部组件(如喇叭、录像机、DVD播......
  • C/C++C/C++语言课程设计参考题目[2023-06-25]
    C/C++C/C++语言课程设计参考题目[2023-06-25]《高级程序设计技术综合课程设计》C/C++语言课程设计参考题目目录信息管理类 1工资管理系统 1职工工资信息管理系统 2职工工资管理系统 2院职工工资管理系统 3公司职工工资管理系统 3工资纳税计算系统 3校际运动会管理系统......