github源码指引:共享内存、数据结构与算法:字符串池StringPool

初级代码游戏的专栏介绍与文章目录-CSDN博客

我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。

这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。


        专题:共享内存、数据结构与算法_初级代码游戏的博客-CSDN博客

        本文讲解字符串池的示例代码。

        字符串池是一个特殊的结构,用来减少重复的字符串存储(现实系统中会存在大量重复的字符串,实测超过95%)。字符串就是用一个句柄(相当于指针)来代替重复的字符串。

        由于共享内存的特性,横表存储的字符串要占用最大可能的空间,因此是非常浪费的。

一、演示代码

        代码如下:

#include "shmStringPool2.h"
class CTest_StringPool2x
{
public:typedef StringPool2x<CTest_StringPool2x, PI_TEST_1, PI_TEST_2, CDemoData > T_CONTINER;static int test_StringPool2x(int argc, char** argv){T_CONTINER a("test", 1);a.DestoryShm();if (!a.CreateShm())return __LINE__;thelog << endi;if (!a.Attach(false))return __LINE__;thelog << endi;vector<T_CONTINER::HANDLE > v_handles;for (int i = 0; i < 10; ++i){T_CONTINER::HANDLE h;char buf[256];sprintf(buf, "abc%d", (5 == i ? 6 : i));if (!a.AddString(buf, h))thelog << "添加失败 " << i << " : " << buf << ende;else{thelog << "添加成功 " << i << " : " << buf << ende;v_handles.push_back(h);}}for (vector<T_CONTINER::HANDLE >::const_iterator it = v_handles.begin(); it != v_handles.end(); ++it){string str;thelog << (*it).handle << " : " << a.GetString(*it) << endi;}a.RunCmdUI();return 0;}
};

         注意字符串池有两个版本,StringPool只包含一个共享内存块,但是添加时要在私有内存构建缓存,StringPool2x把索引也建立在共享内存,节省时间。示例中用的是StringPool2x:

	typedef StringPool2x<CTest_StringPool2x, PI_TEST_1, PI_TEST_2, CDemoData > T_CONTINER;

        解释一下模板参数:

  1. 用于区分类型的参数,代码中实际并不使用,仅仅用来区分不同的池(实际上靠后面几个参数也足以区分了)
  2. 第一个共享内存的内部索引
  3. 第二个共享内存的内部索引
  4. 头数据,头数据是客户代码随意使用的

二、运行

        rebuild.sh 编译,run.sh运行,命令24(初次运行要先创建主共享内存命令0-1):

----------------------------------------
命令表:(q=exit)
0 管理
1 test_BinaryPool
3 test_CMultiProcessServer
4 test_CMultiProcessServer_view
5 test_CMultiProcessServer_speed
6 test_CMultiProcessServer_direct
7 test_RebuildSet
12 UDP测试客户端
13 UDP测试服务端
14 CStressTesting
15 CTestCSimpleMultiProcess_mutex atomic
16 CTest_hash
17 T_SHM_HASH
20 T_ARRAY
21 T_SHMSET_NO_MUTEX
22 T_SHMSET(带互斥)
23 T_SHMSET_lower_bound(带互斥)
24 StringPool2x
88 test_CMyRWMutex
89 test_T_SHM_SET_GROUP
90 test_shm_IActiveObject
91 test_ShmMultiMap
99 test_ParseFromXml
........................................
----------------------------------------
请选择命令:(q=exit default=24):
[09-02 17:55:59][应用][信息] 用户输入的是:24
[09-02 17:55:59][12377- 1][信息][shmIActiveObject.h      : 651(_ProcessThread)][  0.00]删除[test]的[test#]的共享内存...
[09-02 17:55:59][12377- 1][信息][shmArray.h              : 960(AttachToShm)][  0.00]test# 连接共享内存成功 PI_N 2 PART 0 shmid = 163841 p 0x7fdcd8a1c000
[09-02 17:55:59][12377- 1][信息][shmEnv.cpp              : 624(GetShmConfig)][  0.00]未配置 SHM_CONFIG default.test#
[09-02 17:55:59][12377- 1][信息][shmIActiveObject.h      : 706(_ProcessThread)][  0.00][test]的[test#]删除共享内存 用时 0 秒
[09-02 17:55:59][12377- 2][信息][shmIActiveObject.h      : 651(_ProcessThread)][  0.00]删除[test]的[test]的共享内存...
[09-02 17:55:59][12377- 2][信息][shmArray.h              : 960(AttachToShm)][  0.00]test 连接共享内存成功 PI_N 1 PART 0 shmid = 196610 p 0x7fdcd8a34000
[09-02 17:55:59][12377- 2][信息][shmEnv.cpp              : 624(GetShmConfig)][  0.00]未配置 SHM_CONFIG default.test
[09-02 17:55:59][12377- 2][信息][shmIActiveObject.h      : 706(_ProcessThread)][  0.00][test]的[test]删除共享内存 用时 0 秒
[09-02 17:55:59][应用][12377][信息][shmIActiveObject.h      : 753(_Process)][  0.00][test]的[test]删除共享内存处理失败
[09-02 17:55:59][应用][12377][信息][shmIActiveObject.h      : 753(_Process)][  0.00][test]的[test#]删除共享内存处理失败
[09-02 17:55:59][应用][12377][信息][shmIActiveObject.h      : 761(_Process)][  0.00]总共用时 0 秒
[09-02 17:55:59][应用][12377][信息][shmIActiveObject.h      : 762(_Process)][  0.00][test]共 2 个,成功删除共享内存 0 个,失败 2 个,未定义 0 个
[09-02 17:55:59][应用][12377][信息][shmIActiveObject.h      : 764(_Process)][  0.00]
test 删除共享内存
SHM NAME                                            PI CSW TOTAL BLOCK R_LENGTH CAPACITY CAPACITY SIZE SIZE % OPERATION    DUAL RESULT OPERATION    DUAL RESULT
--------------------------------------------------- -- --- ----- ----- -------- -------- -------- ---- ---- - ------------ ---- ------ ------------ ---- ------
test                                                 0 ---     .     .        .        .        .    .    . .                          删除共享内存    0 ERRORtest                                             1 ---     .     .        .        .        .    .    . . 删除共享内存    0 ERRORtest#                                            2 ---     .     .        .        .        .    .    . . 删除共享内存    0 ERROR
成功 0 个 失败 2 个 未定义 0 个 忽略 0 个 用时 0 秒
--------------------------------------------------- -- --- ----- ----- -------- -------- -------- ---- ---- - ------------ ---- ------ ------------ ---- ------[09-02 17:55:59][12377- 3][信息][shmIActiveObject.h      : 627(_ProcessThread)][  0.00]创建[test]的[test]...
[09-02 17:55:59][12377- 4][信息][shmIActiveObject.h      : 627(_ProcessThread)][  0.01]创建[test]的[test#]...
[09-02 17:55:59][12377- 3][出错][shmEnv.h                : 304(GetRegFromDb)][  0.01]共享内存 default test 0 不存在,可能的原因:主机重启或手工删除
[09-02 17:55:59][12377- 4][出错][shmEnv.h                : 304(GetRegFromDb)][  0.01]共享内存 default test# 0 不存在,可能的原因:主机重启或手工删除
[09-02 17:55:59][12377- 3][信息][shmArray.h              :1024(_DestoryShm)][  0.01]test 0 连接到共享内存失败
[09-02 17:55:59][12377- 4][信息][shmArray.h              :1024(_DestoryShm)][  0.01]test# 0 连接到共享内存失败
[09-02 17:55:59][12377- 3][信息][shmEnv.cpp              : 624(GetShmConfig)][  0.01]未配置 SHM_CONFIG default.test
[09-02 17:55:59][12377- 3][信息][shmArray.h              :1074(_CreateShm)][  0.01]default test 0 未配置的最大记录数
[09-02 17:55:59][12377- 3][信息][shmArray.h              :1076(_CreateShm)][  0.01]使用默认值 1024
[09-02 17:55:59][12377- 3][信息][shmArray.h              : 395(_CreateShmIfNeed)][  0.01]创建新共享内存成功,id = 229377
[09-02 17:55:59][12377- 4][信息][shmEnv.cpp              : 624(GetShmConfig)][  0.01]未配置 SHM_CONFIG default.test#
[09-02 17:55:59][12377- 4][信息][shmArray.h              :1074(_CreateShm)][  0.01]default test# 0 未配置的最大记录数
[09-02 17:55:59][12377- 4][信息][shmArray.h              :1076(_CreateShm)][  0.01]使用默认值 1024
[09-02 17:55:59][12377- 4][信息][shmArray.h              : 395(_CreateShmIfNeed)][  0.01]创建新共享内存成功,id = 262146
[09-02 17:55:59][12377- 3][信息][shmArray.h              :1129(_CreateShm)][  0.01]基础共享内存创建完成
[09-02 17:55:59][12377- 3][信息][shmIActiveObject.h      : 706(_ProcessThread)][  0.01][test]的[test]创建 用时 0 秒
[09-02 17:55:59][12377- 4][信息][shmArray.h              :1129(_CreateShm)][  0.01]基础共享内存创建完成
[09-02 17:55:59][12377- 4][信息][shmArray.h              : 960(AttachToShm)][  0.01]test# 连接共享内存成功 PI_N 2 PART 0 shmid = 262146 p 0x7fdcd8a1c000
[09-02 17:55:59][12377- 4][信息][shmSet_NoMutex.h        :1414(set_CreateShm)][  0.01]数据结构构造成功
[09-02 17:55:59][12377- 4][信息][shmSet_NoMutex.h        :1416(set_CreateShm)][  0.01]创建成功
[09-02 17:55:59][12377- 4][信息][shmIActiveObject.h      : 706(_ProcessThread)][  0.01][test]的[test#]创建 用时 0 秒
[09-02 17:55:59][应用][12377][信息][shmfctest2.h            : 350(test_StringPool2x)][  0.01]
[09-02 17:55:59][12377- 5][信息][shmArray.h              : 960(AttachToShm)][  0.01]test 连接共享内存成功 PI_N 1 PART 0 shmid = 229377 p 0x7fdcd8a34000
[09-02 17:55:59][12377- 6][信息][shmArray.h              : 960(AttachToShm)][  0.01]test# 连接共享内存成功 PI_N 2 PART 0 shmid = 262146 p 0x7fdcd8a1c000
[09-02 17:55:59][应用][12377][信息][shmfctest2.h            : 352(test_StringPool2x)][  0.01]
[09-02 17:55:59][应用][12377][出错][shmfctest2.h            : 362(test_StringPool2x)][  0.01]添加成功 0 : abc0
[09-02 17:55:59][应用][12377][出错][shmfctest2.h            : 362(test_StringPool2x)][  0.01]添加成功 1 : abc1
[09-02 17:55:59][应用][12377][出错][shmfctest2.h            : 362(test_StringPool2x)][  0.01]添加成功 2 : abc2
[09-02 17:55:59][应用][12377][出错][shmfctest2.h            : 362(test_StringPool2x)][  0.01]添加成功 3 : abc3
[09-02 17:55:59][应用][12377][出错][shmfctest2.h            : 362(test_StringPool2x)][  0.01]添加成功 4 : abc4
[09-02 17:55:59][应用][12377][出错][shmfctest2.h            : 362(test_StringPool2x)][  0.01]添加成功 5 : abc6
[09-02 17:55:59][应用][12377][出错][shmfctest2.h            : 362(test_StringPool2x)][  0.01]添加成功 6 : abc6
[09-02 17:55:59][应用][12377][出错][shmfctest2.h            : 362(test_StringPool2x)][  0.01]添加成功 7 : abc7
[09-02 17:55:59][应用][12377][出错][shmfctest2.h            : 362(test_StringPool2x)][  0.01]添加成功 8 : abc8
[09-02 17:55:59][应用][12377][出错][shmfctest2.h            : 362(test_StringPool2x)][  0.01]添加成功 9 : abc9
[09-02 17:55:59][应用][12377][信息][shmfctest2.h            : 369(test_StringPool2x)][  0.01]0 : abc0
[09-02 17:55:59][应用][12377][信息][shmfctest2.h            : 369(test_StringPool2x)][  0.01]5 : abc1
[09-02 17:55:59][应用][12377][信息][shmfctest2.h            : 369(test_StringPool2x)][  0.01]10 : abc2
[09-02 17:55:59][应用][12377][信息][shmfctest2.h            : 369(test_StringPool2x)][  0.01]15 : abc3
[09-02 17:55:59][应用][12377][信息][shmfctest2.h            : 369(test_StringPool2x)][  0.01]20 : abc4
[09-02 17:55:59][应用][12377][信息][shmfctest2.h            : 369(test_StringPool2x)][  0.01]25 : abc6
[09-02 17:55:59][应用][12377][信息][shmfctest2.h            : 369(test_StringPool2x)][  0.01]25 : abc6
[09-02 17:55:59][应用][12377][信息][shmfctest2.h            : 369(test_StringPool2x)][  0.01]30 : abc7
[09-02 17:55:59][应用][12377][信息][shmfctest2.h            : 369(test_StringPool2x)][  0.01]35 : abc8
[09-02 17:55:59][应用][12377][信息][shmfctest2.h            : 369(test_StringPool2x)][  0.01]40 : abc9
[09-02 17:55:59][应用][12377][信息][shmIActiveObject.h      :1059(RunCmdUI)][  0.01]
当前对象:test 子项[test test# ]b:返回上一层 child:选择子项操作 默认显示子项列表和最后操作状态
1:创建 2:连接(只读) 3:连接(可写) 4:断开 5:禁用互斥 6:清除数据 7:创建私有 8:删除共享内存 9:显示 10:数据
11:从数据库加载 12:保存到数据库
21:从目录加载 22:保存到目录 23:导出为文本文件
31:从目录加载到私有内存 32:销毁私有内存
97:repair 98:check 99:ToDo 100:shell(q=exit ):

        仔细注意,数据5是不存在的,因为代码把5设置成了6。


(这里是文档结束)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/878606.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5. MyBatis 如何实现数据库类型和 Java 类型的转换的?

MyBatis 在处理数据库查询结果或传递参数时&#xff0c;需要将数据库类型与 Java 类型之间进行转换。MyBatis 提供了多种方式来实现这种类型转换&#xff0c;主要通过内置的 TypeHandler&#xff08;类型处理器&#xff09;机制。 1. TypeHandler 的作用 TypeHandler 是 MyBat…

C++ STL 之哈希 map unordered_map

一. 概述 在C中&#xff0c;unordered_map 是一个关联容器&#xff0c;是一种基于哈希表的键值对容器&#xff0c;它存储了键值对&#xff08;key-value&#xff09;&#xff0c;其中每个键&#xff08;key&#xff09;都是唯一的。 二. map & unordered_map的区别 map内…

rqueue使用笔记

文章目录 maven依赖引入监听器注入和发送消息接收消息属性配置 项目用到rqueue&#xff0c;虽然知道和redis相关&#xff0c;但是肯定有不一样的地方&#xff0c;做个笔记。 maven依赖 网上找个能用的版本就行&#xff0c;如&#xff1a; <dependency><groupId>c…

「深入理解」HTML Meta标签:网页元信息的配置

「深入理解」HTML Meta标签&#xff1a;网页元信息的配置 HTML的<meta>元素用于提供关于HTML文档的元数据&#xff08;metadata&#xff09;&#xff0c;这些信息对于浏览器和其他处理HTML文档的应用程序来说是非常有用的&#xff0c;如&#xff1a;<base>、<li…

【网络安全】服务基础第一阶段——第九节:Windows系统管理基础---- Windows_AD域

目录 一、域与活动目录 1.1 工作组 1.2 域 1.2.1 域&#xff08;Domain&#xff09; 1.2.2 域控制器&#xff08;Domain Controller&#xff0c;DC&#xff09; 1.2.3 功能和角色 1.2.4 管理和监控 1.2 5 域结构 1.3 组织单元&#xff08;Organizational Unit&#xff…

集成电路学习:什么是IP知识产权

一、IP&#xff1a;知识产权 IP是Intellectual Property的缩写&#xff0c;即知识产权。知识产权是一种无形的财产权&#xff0c;也称智力成果权&#xff0c;它指的是通过智力创造性劳动所获得的成果&#xff0c;并且是由智力劳动者对成果依法享有的专有权利。这种权利包括人身…

性能优化:自动化处理系统设计

性能优化&#xff1a;自动化处理系统设计 前言需求分析系统设计1. 调度中心2. 任务执行器3. 错误处理机制4. 通知系统5. 报表生成器6. 日志记录器 技术实现结语 前言 在当今这个信息爆炸、技术日新月异的时代&#xff0c;企业面临着前所未有的挑战和机遇。随着业务量的不断增长…

基于Yolov5_6.1、LPRNet、PySide6开发的车牌识别系统

项目概述 项目背景 随着车辆数量的不断增加&#xff0c;车牌识别系统在交通管理、停车场自动化等领域变得越来越重要。本项目利用先进的深度学习技术和现代图形用户界面框架来实现高效的车牌识别功能。 项目特点 高效识别&#xff1a;采用 YOLOv5_6.1 进行车牌定位&#xff…

差分传输与单端传输

差分与单端传输 本页讨论模拟信号传输中的两个概念&#xff1a;“单端”和“差分”。模拟信号用于将模拟仪器的输出传送到数字转换器。虽然数字信号对干扰的容忍度相对较高&#xff0c;但模拟信号却可能受到环境中电磁波的干扰和改变。本文档将解释这一问题&#xff0c;并描述…

React 入门第九天:与后端API的集成与数据管理

在React学习的第九天&#xff0c;我集中学习了如何与后端API进行集成。这一步是将静态的React应用转变为动态、可交互的关键。通过与后端通信&#xff0c;我们可以从服务器获取数据、发送用户输入以及处理复杂的业务逻辑。 1. 使用fetch进行数据请求 React没有内置的HTTP库&a…

Assembly 跨域通信AppDomain

Assembly 怎么实现跨域通信 在 .NET Framework 中&#xff0c;AppDomain 是一种用于隔离应用程序的机制&#xff0c;可以在单个进程内创建多个应用程序域&#xff08;AppDomain&#xff09;。每个应用程序域都有自己的程序集、资源和内存空间。通过使用 AppDomain&#xff0c;…

Linux 搭建 Java 部署环境:安装 JDK 和 MySQL 的教程

目录 一、apt 二、JDK 2.1 更新软件包 2.2 安装openjdk 三、MySQL 3.1 使用apt安装MySQL 3.2 查看MySQL的状态 3.3 MySQL 安装安全设置 3.4 设置密码 一、apt apt(Advanced Packaging Tool), Linux软件包管理工具&#xff0c;用于在Ubuntu、Debian和相关Linux发行版上…

OcrLiteNcnn:Windows环境打包及Java调用

目录结构 前言cmake安装源码下载说明Windows源码编译执行“cmake -DCMAKE_BUILD_TYPE=Release ..”执行“cmake --build . --config Release -- -m:6”编译完成识别图片命令行调用Java调用前言 Java实现OCR识别图片中的文字,小编先前整理过一篇在Linux环境中基于“ChineseOcr…

OpenCV入门12.2:SURF与SIFT比较及SURF示例

SIFT (Scale-Invariant Feature Transform): 提出时间: 1999年&#xff0c;由David Lowe提出。关键特点: 能够检测和描述图像中的关键点&#xff0c;这些关键点对旋转、缩放和部分亮度变化具有不变性。计算复杂度: 相对较高&#xff0c;因为SIFT使用了高斯差分核来检测关键点&…

小程序面试题二

一、微信小程序的开发原理是什么&#xff1f; 微信小程序的开发原理主要基于Web规范&#xff0c;采用HTML、CSS和JavaScript等前端技术&#xff0c;并结合微信官方提供的特定框架和API进行开发。以下是小程序开发原理的详细解析&#xff1a; 1. 开发框架与语言 WXML&#xff…

全局安装react

1、首先安装react脚手架 npm install -g create-react-app2、创建react项目 create-react-app my-app3、 PS D:\桌面\papers\subject> create-react-app my-react-appCreating a new React app in D:\桌面\papers\subject\my-react-app.Installing packages. This might …

解释 JVM 的内存模型(堆、栈、方法区等),并简述如何通过调整 JVM 参数来优化应用程序的性能?

JVM&#xff08;Java Virtual Machine&#xff09;的内存模型是 Java 程序运行的基础&#xff0c;理解它的各个组成部分对于优化应用程序的性能至关重要。 JVM 的内存模型主要包括以下几个部分&#xff1a; 堆&#xff08;Heap&#xff09;栈&#xff08;Stack&#xff09;方…

数据结构(1)数据结构基础(单向链表)

一、什么是数据结构 数据结构是一组用来保存一种或多种特定关系的数据的集合。其主要目的是组织和存储数据&#xff0c;以便于高效的访问和修改。在程序设计中&#xff0c;将大量而复杂的问题以特定的数据类型和特定的存储结构存储在内存中&#xff0c;并在此基础上实现某个特定…

Docker安装Neo4j图数据库和APOC插件

文章目录 一、前言二、安装Neo4j三、测试Neo4j四、安装APOC插件五、测试APOC插件 一、前言 官方文档&#xff1a;https://neo4j.com/docs/operations-manual/current/docker/introduction/ 二、安装Neo4j 我这里以 5.23.0 版的 Neo4j 为例 拉取镜像 docker pull neo4j:5.23.0…

Java-用户线程与守护线程

在Java中&#xff0c;线程分为用户线程和守护线程。用户线程是程序的主要线程&#xff0c;而守护线程则是为用户线程提供支持的后台线程。以下是对这两种线程的详细解释以及示例代码。 用户线程与守护线程的区别 用户线程&#xff1a; 用户线程是应用程序中执行的主要线程&…