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 ERROR
    test                                             1 ---     .     .        .        .        .    .    . . 删除共享内存    0 ERROR
    test#                                            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。


(这里是文档结束)

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值