我的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;
解释一下模板参数:
- 用于区分类型的参数,代码中实际并不使用,仅仅用来区分不同的池(实际上靠后面几个参数也足以区分了)
- 第一个共享内存的内部索引
- 第二个共享内存的内部索引
- 头数据,头数据是客户代码随意使用的
二、运行
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。
(这里是文档结束)