逐步实现TCP服务端Step03-2:封装SharedMemory、SHMFactory类

一个SharedMemory实例对应于一块共享内存,SharedMemory所提供的方法都是针对于这块已被创建的共享内存的。共享内存的创建不应该由SharedMemory来负责,毕竟自己不能创建自己。

这里再定义一个工厂类SHMFactory负责“生产”SharedMemory实例。

SHMFactory封装了SharedMemory对象的创建过程,要创建一个SharedMemory对象,直接调用SHMFactory提供的静态方法CreateProduct即可。

这里所使用的共享内存,没必要再进行分类,SharedMemory类没有继承关系。这个比简单工厂模式更简陋一些。

SharedMemory中的new运算符:直接返回已被创建的那块共享内存的首地址shm_以便下一步在该块内存起始位置构造SharedMemory对象。

注意,SharedMemory类是可以实现“恢复”功能的。因为共享内存由内核维护,即使进程关闭了,共享内存还是存在,其中的数据还是完好的。此时,若再次启动进程,便可从共享内存中“恢复”对象的状态。SharedMemory的实例本身就是在共享内存上构建的,对其进行“恢复”是完全可能的。不过,这里为简单起见,先不考虑恢复的问题,每次启动进程时,不会去使用共享内存中已存在的数据,而是在new对象的时候,直接Init,将数据抹掉。

SharedMemory中的cur_segment_属性:共享内存是一块连续的内存块,实际在使用这块空间的时候,可能要对其进行分段。比如第0~100字节存放A数据,101~300字节存放B数据。cur_segment_是一个指向尚未被分段的内存块的起始位置的指针。

演示几个方法的工作过程

SHMFactory类中的CreateProduct方法 : CreateProduct内部创建共享内存成功后会new一个SharedMemory对象,SharedMemory类中已重载new操作符,构造该对象所占用的就是共享内存起始位置处开始的空间。CreateProduct方法要求传入的size参数,用来指定调用者所期望得到的共享内存空间尺寸。调用者不用考虑构建SharedMemory对象要耗费的那部分空间,CreateProduct在创建共享内存的时候会将这部分空间算进去。

SharedMemory类中的CreateSegment方法 : 

SharedMemory、SHMFactory类的实现详见:

此外,netio.ccs.cc也做了相应的修改。

<==  index  ==>