消息队列

简介:

        之前在设计消息队列的时候,用的双缓冲,保持一个读线程,一个写线程!! 读线程对read_list进行操作,写线程对write_list进行操作,保持一个队列的完整行就ok!

        比如如果想保持write_list一致,就是在插入操作的时候枷锁,在read_list为空的时候需要和write_list进行交换,也需要枷锁!!这样就保证了很少的线程冲突!!!当时的消息队列的双缓冲使用std::list进行设计!

        第二个版本的消息队列,进行了很大程度上的改进,使用了三个缓冲队列,一个读队列,一个写队列,一个缓冲队列,三个队列分别用数组形式体现,枷锁只要保证缓冲队列一致既可,即写队列向缓冲队列提交数据的时候,需要枷锁,读队列再向缓冲队列交换数据的时候,需要枷锁!想比较于上面的方法,枷锁次数明显减少,并且使用数组的形式,较std::list更为高效!这个消息队列在原公司的双缓冲队列的基础之上,进行设计!

        给出测试代码!和部分接口!


DuplexList _List;
 
 
void* producer(void* args)
{
    int i=0;
    while(1)
    {
        int* j = new int();
        *j = i;
        _List.append(j);
        usleep(0);
        i++;
        if(i % 100 == 0)
        {
            usleep(100);
        }
    }
    return (void*)0;
}
 
int main()
{
    pthread_t pid;
    pthread_create(&pid,NULL,producer,NULL);
 
    long long int start = get_os_system_time();
 
    int old=-1;
    while(true)
    {
        int* j = 0;
        _List.peek((void* &)j);
        if(j != 0)
        {
            usleep(0);
            if(*j != old + 1)
            {
                printf("error!\n");
            }
            old = *j;
            delete j;
        }
    }
    return 0;
}

    做了一下午的测试,没有问题,传递10w条消息大概使用20ms左右!这个性能可以了!

       之前在语言的选择上面做了很长时间的犹豫,一些java的朋友劝我说,一个消息队列的错误,那么整个游戏就会崩溃!劝我使用java的集成结构!! 不过最终我还是坚持了C++,底层代码使用C++,逻辑使用lua来编写!只是在AI的问题上面还有很多犹豫!


相关文章
|
Linux API
嵌入式Linux中的 gpio、gpiod基本分析
嵌入式Linux中的 gpio、gpiod基本分析
1858 0
|
网络安全
Xshell7连接Debian12系统,中文显示乱码,解决办法一览!
在使用Xshell 7连接Debian 12时,中文乱码通常由字符编码或字体设置不当引起。解决方法包括:1) 设置Xshell编码为UTF-8;2) 配置支持中文字体(如Microsoft YaHei);3) 调整Debian 12的Locale配置,确保支持zh_CN.UTF-8;4) 检查SSH服务端配置。完成设置后,重新连接并验证中文显示是否正常。注意字体优先级及系统兼容性,必要时调整环境变量或权限设置。
1185 3
|
存储 智能硬件
CPU的定义与功能与架构
CPU(中央处理器)是计算机的核心部件,负责执行程序指令、控制数据传输和进行运算。它能处理算术与逻辑运算,并协调其他硬件协同工作。x86架构源于英特尔,适用于PC和服务器,采用复杂指令集;ARM架构则由Acorn等公司开发,广泛用于移动设备和嵌入式系统,采用精简指令集,功耗低且能效比高。
1876 5
|
Ubuntu
vscode配置clang-format自动格式化代码
vscode配置clang-format自动格式化代码
4479 0
|
Oracle 关系型数据库 数据库
❤️Docker中只需2步即可拥有Oracle 11G企业版环境,史上最快部署❤️
❤️Docker中只需2步即可拥有Oracle 11G企业版环境,史上最快部署❤️
1898 0
❤️Docker中只需2步即可拥有Oracle 11G企业版环境,史上最快部署❤️
|
JavaScript 数据管理 编译器
揭秘 ArkTS 与 TypeScript 的神秘差异:鸿蒙系统开发者的必备知识与实战技巧
【10月更文挑战第18天】ArkTS 是华为为鸿蒙系统(HarmonyOS)推出的开发语言,作为 TypeScript 的超集,它针对鸿蒙系统的分布式特性和需求进行了优化和扩展。ArkTS 强化了分布式数据管理、类型系统、编译与运行时性能,并支持声明式 UI 和专为鸿蒙设计的 API,使开发者能够更高效地开发跨设备协同工作的应用。
1372 6
|
Linux C语言 C++
vsCode远程执行c和c++代码并操控linux服务器完整教程
这篇文章提供了一个完整的教程,介绍如何在Visual Studio Code中配置和使用插件来远程执行C和C++代码,并操控Linux服务器,包括安装VSCode、安装插件、配置插件、配置编译工具、升级glibc和编写代码进行调试的步骤。
4576 0
vsCode远程执行c和c++代码并操控linux服务器完整教程
|
存储 Linux 开发工具
简述利用samba实现windows和linux之间文件同步
简述利用samba实现windows和linux之间文件同步
993 0
|
C++
Visual Studio 2019 设置手动触发 clang-format 格式化
合作开发时,.clang-format 文件会在编写代码的过程中自动执行格式化,触发某些条件将自动格式化整个文件,有可能导致代码冲突的概率提升,也会造成编码时的不便。
2325 0
Visual Studio 2019 设置手动触发 clang-format 格式化
|
IDE 编译器 Linux
用GCC开发STM32入门一(使用官方库)
用GCC开发STM32入门一(使用官方库)