github源码指引:共享内存、数据结构与算法:平衡二叉树set ...

打印 上一主题 下一主题

主题 578|帖子 578|积分 1734

低级代码游戏的专栏先容与文章目录-CSDN博客
我的github:codetoys,全部代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。
这些代码大部门以Linux为目标但部门代码是纯C++的,可以在任何平台上利用。

        相干专题:共享内存、数据结构与算法_低级代码游戏的博客-CSDN博客
        源码位置:shmfc
        基础:github源码指引:源码结构、编译、运行_github编译-CSDN博客
        承接上一篇:github源码指引:共享内存、数据结构与算法:作为基础的数组-CSDN博客
        本文先容的T_SHMSET_NO_MUTEX基于上一篇先容的T_ARRAY,实现平衡二叉树,尚未增长互斥功能,这两个数据结构是大部门后续数据结构的基础。
目录
一、演示代码 
二、运行演示代码


一、演示代码 

        演示代码仍位于shmfctest2.h:
  1. class CTestT_ARRAY
  2. {
  3. public:
  4.         struct DemoData : public CActiveObjectBase
  5.         {
  6.                 long n = 0;
  7.                 sstring<8> s;
  8.                 //用于需要排序的场合
  9.                 bool operator < (CDemoData const& tmp)const { return n < tmp.n; }
  10.                 //某些场合也需要等于
  11.                 bool operator == (CDemoData const& tmp)const { return n == tmp.n; }
  12.                 friend ostream& operator << (ostream& o, DemoData const& d)
  13.                 {
  14.                         return o << d.n << " " << d.s.c_str();
  15.                 }
  16.                 //关键字的hash值,用于分块场合,应保证hash值的最后一部分仍然是平均分布的
  17.                 long keyhash()const { return n; }
  18.                 //用于输出数据的场合
  19.                 string& toString(string& str)const
  20.                 {
  21.                         char buf[2048];
  22.                         sprintf(buf, "%ld %s", n, s.c_str());
  23.                         return str = buf;
  24.                 }
  25.                 //用于表格输出
  26.                 static bool AddTableColumns(CHtmlDoc::CHtmlTable2& table)
  27.                 {
  28.                         table.AddCol("N", CHtmlDoc::CHtmlDoc_DATACLASS_RIGHT);
  29.                         table.AddCol("S", CHtmlDoc::CHtmlDoc_DATACLASS_RIGHT);
  30.                         return true;
  31.                 }
  32.                 bool AddTableData(CHtmlDoc::CHtmlTable2& table)const
  33.                 {
  34.                         table.AddData(n);
  35.                         table.AddData(s.c_str());
  36.                         return true;
  37.                 }
  38.         };
  39.         static int test_T_ARRAY(int argc, char** argv)
  40.         {
  41.                 T_ARRAY<DemoData, PI_TEST_1, CDemoData > a("test", 1);
  42.                 a.DestoryShm();
  43.                 if (!a.CreateShm())return __LINE__;
  44.                 if (!a.Attach(false))return __LINE__;
  45.                 for (int i = 0; i < 100; ++i)
  46.                 {
  47.                         DemoData tmp;
  48.                         tmp.n = 10000 + i;
  49.                         tmp.s = "abc";
  50.                         T_ARRAY<DemoData, PI_TEST_1, CDemoData >::HANDLE h;
  51.                         a.Add(tmp, h);
  52.                         thelog << h.handle << endi;
  53.                 }
  54.                 for (int i = 0; i < a.Size(); ++i)
  55.                 {
  56.                         string str;
  57.                         thelog << "第" << i << "个数据:" << a.Get(i)->toString(str) << endi;
  58.                 }
  59.                 a.RunCmdUI();
  60.                 return 0;
  61.         }
  62. };
  63. #include "shmSet_NoMutex.h"
  64. class CTest_T_SHMSET_NO_MUTEX
  65. {
  66. public:
  67.         struct DemoData : public CActiveObjectBase
  68.         {
  69.                 long n = 0;
  70.                 sstring<8> s;
  71.                 //用于需要排序的场合
  72.                 bool operator < (DemoData const& tmp)const { return n < tmp.n; }
  73.                 //某些场合也需要等于
  74.                 bool operator == (DemoData const& tmp)const { return n == tmp.n; }
  75.                 friend ostream& operator << (ostream& o, DemoData const& d)
  76.                 {
  77.                         return o << d.n << " " << d.s.c_str();
  78.                 }
  79.                 //关键字的hash值,用于分块场合,应保证hash值的最后一部分仍然是平均分布的
  80.                 long keyhash()const { return n; }
  81.                 //用于输出数据的场合
  82.                 string& toString(string& str)const
  83.                 {
  84.                         char buf[2048];
  85.                         sprintf(buf, "%ld %s", n, s.c_str());
  86.                         return str = buf;
  87.                 }
  88.                 //用于表格输出
  89.                 static bool AddTableColumns(CHtmlDoc::CHtmlTable2& table)
  90.                 {
  91.                         table.AddCol("N", CHtmlDoc::CHtmlDoc_DATACLASS_RIGHT);
  92.                         table.AddCol("S", CHtmlDoc::CHtmlDoc_DATACLASS_RIGHT);
  93.                         return true;
  94.                 }
  95.                 bool AddTableData(CHtmlDoc::CHtmlTable2& table)const
  96.                 {
  97.                         table.AddData(n);
  98.                         table.AddData(s.c_str());
  99.                         return true;
  100.                 }
  101.         };
  102.         static int test_T_SHMSET_NO_MUTEX(int argc, char** argv)
  103.         {
  104.                 T_SHMSET_NO_MUTEX<DemoData, PI_TEST_1, CDemoData > a("test", 1);
  105.                 a.DestoryShm();
  106.                 if (!a.CreateShm())return __LINE__;
  107.                 if (!a.Attach(false))return __LINE__;
  108.                 for (int i = 0; i < 10; ++i)
  109.                 {
  110.                         DemoData tmp;
  111.                         tmp.n = rand() % 10;
  112.                         tmp.s = "abc";
  113.                         thelog << i << " n:" << tmp.n << " handle:" << a.insert(tmp).first.handle << endi;
  114.                 }
  115.                 for (T_SHMSET_NO_MUTEX<DemoData, PI_TEST_1, CDemoData >::const_iterator it = a.begin(); it!=a.end(); ++it)
  116.                 {
  117.                         string str;
  118.                         thelog << it->toString(str) << endi;
  119.                 }
  120.                 for (int i = 0; i < 10; ++i)
  121.                 {
  122.                         DemoData tmp;
  123.                         tmp.n = i;
  124.                         T_SHMSET_NO_MUTEX<DemoData, PI_TEST_1, CDemoData >::const_iterator it = a.find(tmp);
  125.                         string str;
  126.                         if(it!=a.end())thelog << i << " 找到 handle:" << it.handle <<" "<<it->toString(str) << endi;
  127.                         else thelog << i << " 没找到 handle:" << it.handle << endi;
  128.                 }
  129.                 a.RunCmdUI();
  130.                 return 0;
  131.         }
  132. };
复制代码
        代码和T_ARRAY的测试代码非常相似,前面界说的DemoData实在是一样的(除了operator<参数名改了一下,因为T_ARRAY没有效到这个函数,所以之前没有发现错误)。
        测试代码同样是创建共享内存、操作数据,最后进入RunCmdUI。
        代码演示了与STL的set相似的insert、iterator遍历和find。
二、运行演示代码

        命令21运行这个演示代码:
  1. ----------------------------------------
  2. 命令表:(q=exit)
  3. 0 管理
  4. 1 test_BinaryPool
  5. 3 test_CMultiProcessServer
  6. 4 test_CMultiProcessServer_view
  7. 5 test_CMultiProcessServer_speed
  8. 6 test_CMultiProcessServer_direct
  9. 7 test_RebuildSet
  10. 12 UDP测试客户端
  11. 13 UDP测试服务端
  12. 14 CStressTesting
  13. 15 CTestCSimpleMultiProcess_mutex atomic
  14. 16 CTest_hash
  15. 17 T_SHM_HASH
  16. 20 T_ARRAY
  17. 21 T_SHMSET_NO_MUTEX
  18. 88 test_CMyRWMutex
  19. 89 test_T_SHM_SET_GROUP
  20. 90 test_shm_IActiveObject
  21. 91 test_ShmMultiMap
  22. 99 test_ParseFromXml
  23. ........................................
  24. ----------------------------------------
  25. 请选择命令:(q=exit default=21):
  26. [08-28 15:46:00][应用][信息] 用户输入的是:21
  27. [08-28 15:46:00][应用][信息][shmArray.h              : 960(AttachToShm)][  0.00]test 连接共享内存成功 PI_N 1 PART 0 shmid = 98306 p 0x7ffade5d0000
  28. [08-28 15:46:00][应用][信息][shmEnv.cpp              : 624(GetShmConfig)][  0.00]未配置 SHM_CONFIG default.test
  29. [08-28 15:46:00][应用][出错][shmEnv.h                : 304(GetRegFromDb)][  0.00]共享内存 default test 0 不存在,可能的原因:主机重启或手工删除
  30. [08-28 15:46:00][应用][信息][shmArray.h              :1024(_DestoryShm)][  0.00]test 0 连接到共享内存失败
  31. [08-28 15:46:00][应用][信息][shmEnv.cpp              : 624(GetShmConfig)][  0.00]未配置 SHM_CONFIG default.test
  32. [08-28 15:46:00][应用][信息][shmArray.h              :1074(_CreateShm)][  0.00]default test 0 未配置的最大记录数
  33. [08-28 15:46:00][应用][信息][shmArray.h              :1076(_CreateShm)][  0.00]使用默认值 1024
  34. [08-28 15:46:00][应用][信息][shmArray.h              : 395(_CreateShmIfNeed)][  0.00]创建新共享内存成功,id = 131074
  35. [08-28 15:46:00][应用][信息][shmArray.h              :1129(_CreateShm)][  0.00]基础共享内存创建完成
  36. [08-28 15:46:00][应用][信息][shmArray.h              : 960(AttachToShm)][  0.00]test 连接共享内存成功 PI_N 1 PART 0 shmid = 131074 p 0x7ffade5d0000
  37. [08-28 15:46:00][应用][信息][shmSet_NoMutex.h        :1414(set_CreateShm)][  0.00]数据结构构造成功
  38. [08-28 15:46:00][应用][信息][shmSet_NoMutex.h        :1416(set_CreateShm)][  0.00]创建成功
  39. [08-28 15:46:00][应用][信息][shmArray.h              : 960(AttachToShm)][  0.00]test 连接共享内存成功 PI_N 1 PART 0 shmid = 131074 p 0x7ffade5d0000
  40. [08-28 15:46:00][应用][信息][shmfctest2.h            : 135(test_T_SHMSET_NO_MUTEX)][  0.00]0 n:3 handle:0
  41. [08-28 15:46:00][应用][信息][shmfctest2.h            : 135(test_T_SHMSET_NO_MUTEX)][  0.00]1 n:6 handle:1
  42. [08-28 15:46:00][应用][信息][shmfctest2.h            : 135(test_T_SHMSET_NO_MUTEX)][  0.00]2 n:7 handle:2
  43. [08-28 15:46:00][应用][信息][shmfctest2.h            : 135(test_T_SHMSET_NO_MUTEX)][  0.00]3 n:5 handle:3
  44. [08-28 15:46:00][应用][信息][shmfctest2.h            : 135(test_T_SHMSET_NO_MUTEX)][  0.00]4 n:3 handle:0
  45. [08-28 15:46:00][应用][信息][shmfctest2.h            : 135(test_T_SHMSET_NO_MUTEX)][  0.00]5 n:5 handle:3
  46. [08-28 15:46:00][应用][信息][shmfctest2.h            : 135(test_T_SHMSET_NO_MUTEX)][  0.00]6 n:6 handle:1
  47. [08-28 15:46:00][应用][信息][shmfctest2.h            : 135(test_T_SHMSET_NO_MUTEX)][  0.00]7 n:2 handle:4
  48. [08-28 15:46:00][应用][信息][shmfctest2.h            : 135(test_T_SHMSET_NO_MUTEX)][  0.00]8 n:9 handle:5
  49. [08-28 15:46:00][应用][信息][shmfctest2.h            : 135(test_T_SHMSET_NO_MUTEX)][  0.00]9 n:1 handle:6
  50. [08-28 15:46:00][应用][信息][shmfctest2.h            : 140(test_T_SHMSET_NO_MUTEX)][  0.00]1 abc
  51. [08-28 15:46:00][应用][信息][shmfctest2.h            : 140(test_T_SHMSET_NO_MUTEX)][  0.00]2 abc
  52. [08-28 15:46:00][应用][信息][shmfctest2.h            : 140(test_T_SHMSET_NO_MUTEX)][  0.00]3 abc
  53. [08-28 15:46:00][应用][信息][shmfctest2.h            : 140(test_T_SHMSET_NO_MUTEX)][  0.00]5 abc
  54. [08-28 15:46:00][应用][信息][shmfctest2.h            : 140(test_T_SHMSET_NO_MUTEX)][  0.00]6 abc
  55. [08-28 15:46:00][应用][信息][shmfctest2.h            : 140(test_T_SHMSET_NO_MUTEX)][  0.00]7 abc
  56. [08-28 15:46:00][应用][信息][shmfctest2.h            : 140(test_T_SHMSET_NO_MUTEX)][  0.00]9 abc
  57. [08-28 15:46:00][应用][信息][shmfctest2.h            : 149(test_T_SHMSET_NO_MUTEX)][  0.00]0 没找到 handle:-1
  58. [08-28 15:46:00][应用][信息][shmfctest2.h            : 148(test_T_SHMSET_NO_MUTEX)][  0.00]1 找到 handle:6 1 abc
  59. [08-28 15:46:00][应用][信息][shmfctest2.h            : 148(test_T_SHMSET_NO_MUTEX)][  0.00]2 找到 handle:4 2 abc
  60. [08-28 15:46:00][应用][信息][shmfctest2.h            : 148(test_T_SHMSET_NO_MUTEX)][  0.00]3 找到 handle:0 3 abc
  61. [08-28 15:46:00][应用][信息][shmfctest2.h            : 149(test_T_SHMSET_NO_MUTEX)][  0.00]4 没找到 handle:-1
  62. [08-28 15:46:00][应用][信息][shmfctest2.h            : 148(test_T_SHMSET_NO_MUTEX)][  0.00]5 找到 handle:3 5 abc
  63. [08-28 15:46:00][应用][信息][shmfctest2.h            : 148(test_T_SHMSET_NO_MUTEX)][  0.00]6 找到 handle:1 6 abc
  64. [08-28 15:46:00][应用][信息][shmfctest2.h            : 148(test_T_SHMSET_NO_MUTEX)][  0.00]7 找到 handle:2 7 abc
  65. [08-28 15:46:00][应用][信息][shmfctest2.h            : 149(test_T_SHMSET_NO_MUTEX)][  0.00]8 没找到 handle:-1
  66. [08-28 15:46:00][应用][信息][shmfctest2.h            : 148(test_T_SHMSET_NO_MUTEX)][  0.00]9 找到 handle:5 9 abc
  67. [08-28 15:46:00][应用][信息][shmIActiveObject.h      : 457(RunCmdUI)][  0.00]
  68. test
  69. b:返回上一层
  70. 1:创建 2:连接(只读) 3:连接(可写) 4:断开 5:禁用互斥 6:清除数据 7:创建私有 8:删除共享内存 9:显示 10:数据
  71. 11:从数据库加载 12:保存到数据库
  72. 21:从目录加载 22:保存到目录 23:导出为文本文件
  73. 31:从目录加载到私有内存 32:销毁私有内存
  74. 97:repair 98:check 99:ToDo 100:shell(q=exit ):
复制代码
        注意,因为插入的数据是随机的,所以一定有几个因为重复而覆盖(STL的标准行为是不覆盖,set里面只有key,但是因为我们现实的利用习惯是key后面附带了许多属性,这些属性是需要覆盖的,所以这里是覆盖的,如果把数据s设置成跟随n变革就可以看出这一点)。
        排序规则由operator<决定,但现实上是由T_SHMSET_NO_MUTEX的模板参数“typename T_COMP = less<T_DATA>”决定的。less的默认实现是利用operator<。
        还有几个功能没有演示:


  • erase 删除
  • lower_bound 符合STL语义的,参数需要提供比力函数,比力函数必须是排序规则的一部门,否则结果是不可预期的
  • upper_bound 类似。这两个不属于set的标准,但是现实场景下非常有效,数据可能是按照a.b.c排序的,现实操作常常是处理全部a的数据或a.b的数据
        联合代码很容易利用这些功能。
        这个模板类之下有好几个处理互斥和分组的范例,都是继续自本范例。

(这里是文档结束)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

勿忘初心做自己

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表