消息队列总结

2023-05-16

一、为什么需要无锁队列?
二、无锁队列是什么?
三、无锁队列是如何实现的?

    inline yqueue_t() {
        begin_chunk = (chunk_t *)malloc(sizeof(chunk_t));
        alloc_assert(begin_chunk);     
        begin_pos = 0;
        back_chunk = NULL;
        back_pos = 0;
        end_chunk = begin_chunk;
        end_pos = 0;
    }

    inline ~yqueue_t() {
        while (true) {
            if (begin_chunk == end_chunk) {
                free(begin_chunk);
                break;
            }
            chunk_t *o = begin_chunk;
            begin_chunk = begin_chunk->next;
            free(o);
        }
        chunk_t *sc = spare_chunk.xchg(NULL);   
        free(sc);                               
    }```

## 1.初始化完成后队列数据状态:

![在这里插入图片描述](https://img-blog.csdnimg.cn/1f7997ef1c2a44fdaee9e6281f95f7b6.png)
begin_pos总是指向队列中数据的第1个元素(初始情况除外,初始情况队列中没有元素)
back_pos 总是指向队列中数据的最后一个元素的下一个位置
end_pos   总是指向队列中数据的最后一个元素的下一个位置的下一个位置(其中没有存数据)

```c
    inline void push() {
        back_chunk = end_chunk;
        back_pos = end_pos;

        if (++ end_pos != N) return;
        chunk_t *sc = spare_chunk.xchg(NULL);
        if (sc) {                            
            end_chunk->next = sc;
            sc->prev = end_chunk;
        } else {
            end_chunk->next = (chunk_t *)malloc(sizeof(chunk_t));
            alloc_assert(end_chunk->next);  // ???
            end_chunk->next->prev = end_chunk;  
        }
        end_chunk = end_chunk->next;
        end_pos = 0;
    }

2.经过初始化然后第一次 push 操作后的队列数据状态:

在这里插入图片描述

三、其他相关知识

    在函数中无法直接定义函数,但可以通过类或Lambda表达式达到类似效果。
    但在类中或函数中可以直接定义类。
#include <iostream>
using namespace std;

void foo() {
    class innerfunc {
    public:
        void operator () () {
            cout<<"inner function object"<<endl;
        }
    };
    innerfunc foo;
    foo();
    
    auto lambdafunc = [=]()->void {
        cout<<"inner lambda expression"<<endl;
    };
    lambdafunc();
}

int main() {
    foo();
    return 0;
}

锁(本质上是一个资源)
1.互斥锁 2.自旋锁 —— 互斥类型的锁
3.读写锁 —— 应用于多读少写的场景(数据库中的行锁)
4.信号量(多应用于多层级的缓存) 5.条件变量 —— 同步类型的锁

无锁
6.原子变量、内存屏障

IPC(进程间通信)
1.pipe(无名管道)
2.FIFO(有名管道)
3.信号量
4.信号
5.消息队列
6.共享内存
7.socket

事务ACID特性
原子性(Atomicity):事务中包括的所有操作要么都做,要么都不做。
一致性(Consistency):数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。
隔离性(Isolation):
持续性(Durability)

事务之间具有三种执行方式
1.串行执行——单处理机系统(事务串行执行方式)
2.并发执行——单处理机系统(事务交叉并发执行方式)
3.并行执行——多处理机系统(事务同时并发方式—>多个事务真正的并行运]

互斥锁与自旋锁区别

互斥锁:
pthread_mutex_lock(&mutex);
pthread_mutex_unlock(&mutex);
当互斥锁被占用后,其他线程申请锁时会进入阻塞状态(让出CPU),加入阻塞队列,等待锁资源被释放。

自旋锁
pthread_spin_lock(&spinlock);
pthread_spin_unlock(&spinlock);
当自旋锁被占用后,其他线程会循环等待(不会让出CPU)一段时间,然后调用sched_yield()直接进入就绪对列,等待下一次CPU资源被释放

主要区别就是执行时,先是从就绪队列中获取任务,故自旋锁执行优先级高于互斥锁。
自旋锁属于非公平锁,属于主动型锁
互斥锁属于公平锁,属于被动型锁,等待系统公平(FIFO)分配资源。

文章参考与<零声教育>的C/C++linux服务期高级架构系统教程学习:

服务器高级架构体系:https://ke.qq.com/course/417774?flowToken=1010783
音视频开发体系:https://ke.qq.com/course/3202131?flowToken=1040744
dpdk系统学习:https://ke.qq.com/course/5066203?flowToken=1043154
内核系统学习:https://ke.qq.com/course/4032547?flowToken=1042705
golang云原生体系:https://ke.qq.com/course/422970?flowToken=1043281

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

消息队列总结 的相关文章

随机推荐

  • Makefile中的$@, $^, $< , $?, $%, $+, $*

    64 表示目标文件 表示所有的依赖文件 lt 表示第一个依赖文件 表示比目标还要新的依赖文件列表 仅当目标是函数库文件中 xff0c 表示规则中的目标成员名 例如 xff0c 如果一个目标是 foo a bar o xff0c 那么 xff
  • 嵌入式方向JD

    偏应用 xff1a 职位描述 xff1a 工作职责 负责业务部门嵌入式软件功能相关开发工作 xff0c 与其他同事合作完成项目交付 任职资格 1 本科及以上学历 xff1b 2 具备3 5年嵌入式行业软件开发经验 xff1b 3 熟练掌握C
  • VirtualBox虚拟机的迁移和快照问题

    查看原文 xff1a http www sijitao net 1616 html 前几天博主迁移了一台测试服务器上的virtualbox虚拟机 本来直接拷贝文件就可以解决的问题 xff0c 结果折腾了我一天 一开始 xff0c 我没注意这
  • 多轴飞行器无人机硬件技术细谈

    http www 52rd com S TXT 2015 3 TXT65233 HTM 多轴飞行器无人机硬件技术细谈 52RD com 2015年3月6日 电子工程专辑 参与 xff1a 2人 我来说两句 在今年CES上无人机成为了展会最大
  • android中onFinishInflate和onSizeChange()的调用时机

    1 onFinishInflate onFinishInflate是view加载完xml之后执行的方法 xff0c 相当于只是完成了布局的映射 xff0c 在这个方法里面是得不到控件的高宽的 xff0c 控件的高宽是必须在调用了onMeas
  • C++构造函数中冒号作用及explicit关键字

    构造函数中冒号作用 xff0c 类给成员变量赋值 xff0c 更适用于成员变量的常量const型 span class token keyword class span span class token class name myClass
  • IDEA(2022.2)搭建Servlet基本框架详细步骤

    文章目录 1 创建基本Web项目1 1 创建新项目1 2 生成Module1 3 设置Web框架1 4 新建导航页 2 配置Tomcat服务器2 1 设置Tomcat2 2 部署Tomcat启动服务2 3 测试Tomcat 3 实现Serv
  • 多径信道

    多径信道 多径信道的低通等效特征多径信道的统计特性时变行为的统计特性 在到达接收天线之前 xff0c 发送的信号遵循许多不同的路径 xff0c 并且这些路径的集合构成多径无线电传播信道 xff08 如图9 3 xff09 产生的信号强度将经
  • [VSCode] VSCode使用C++运行HelloWorld

    一 对于VS Code的介绍 首先需要明确的一点是VSCode并不是一个标准意义上的IDE Integrated Development Environment xff0c 集成开发环境 xff0c VSCode更像是一个功能强大的编辑器
  • 计算机组成.零件之间的通信.总线BUS

    总线干嘛的 xff1f 说白了就是用来传输数据的 xff0c 在计算机的各个部件之间 比如我主存里存的数据CPU要用 xff0c 需要一条线路传过去吧 xff0c CPU内部各个寄存器之间 寄存器与ALU CU与各个部件之间等等等等很多地方
  • 用linux也太爽了啊

    最近更换了公司 xff0c 换成了ubuntu系统进行开发 xff0c 我只能说比windows开发好用多了 xff0c 在windows需要各种工具 xff0c 然而linux的名林嗯行就解决了很多的问题 xff0c 从前windows下
  • 希望计算机专业学生都知道这些宝藏老师

    希望计算机专业学生都知道这些宝藏老师 IT服务圈儿 2022 12 04 17 30 发表于江苏 以下文章来源于程序员库森 xff0c 作者库森 程序员库森 阿里程序员 xff0c 专注分享编程学习 校招求职和大厂面试 IT服务圈儿 关注互
  • docker镜像push到仓库

    镜像可以很方便直接 push 到 docker 的公共仓库或阿里云仓库 1 上传至docker仓库 1 登录docker hub创建自己的仓库地址 xff1a https hub docker com repository create 创
  • 深度学习样本归一化到[0,1]还是[-1,1]

    一般 xff0c 我们需要对神经网络的输入样本进行归一化 xff0c 通常有多种选择 xff0c 比如归一化到 0 1 xff0c 或归一化到 1 1 这两种方法 xff0c 哪种归一化方法更好呢 xff1f 还是没有区别 现在的实验经验
  • ubuntu装机并设置远程连接

    step1 ubuntu16装系统的过程略过 step2 联网 step3 apt get更新 sudo apt get update step4 安装ssh 安装 openssh 服务 sudo apt get install opens
  • ros学习之串口通信(数据读取),并进行发布

    串口参数 波特率 9600 起始位 1 数据位 8 停止位 1 奇偶校验 无 例如超声波模组地址为0X01 则主机发送 0X55 0XAA 0X01 0X01 checksum checksum 61 帧头 43 用户地址 43 指令 am
  • 在Ubuntu上使用LVM对ROOT进行在线扩容

    前提 xff1a 在安装ubuntu的时候 xff0c 是使用LVM进行分区管理的 背景 xff1a 我在安装的时候 xff0c 选择了500G大小 xff0c 磁盘总大小1T xff0c 现在想扩成1T 扩容前 xff1a yang 64
  • realsense D435i双目IMU 数据集

    realsense D435i 双目IMU数据集 使用双目 43 IMU的数据双目内参双目IMU外参 使用双目 43 IMU的数据 双目内参 model type PINHOLE camera name camera image width
  • MobaXterm 登录出现 Network error :Connection timed out

    本来用SSH连接正在操作 xff0c 突然连接不好Linux xff0c 无法登陆 xff0c 出现Network error Connection timed out错误 还以为是自己哪里操作出错了 xff0c 打开本机 cmd命令窗口
  • 消息队列总结

    一 为什么需要无锁队列 xff1f 二 无锁队列是什么 xff1f 三 无锁队列是如何实现的 xff1f span class token keyword inline span span class token class name yq