Skip to content

{ Tag Archives } stl

[翻译]把STL容器放入共享内存

昨天在上篇blog里描写了如何把STL容器放到共享内存里去,不过由于好久不写blog,发觉词汇组织能力差了很多,不少想写的东西写的很零散,今天刚好翻看自己的书签,看到一篇挺老的文章,不过从共享内存到STL容器讲述得蛮全面,还提供了学习的实例,所以顺便翻译过来,并附上原文地址。
共享内存(shm)是当前主流UNIX系统中的一种IPC方法,它允许多个进程把同一块物理内存段(segment)映射(map)到它们的地址空间中去。既然内存段对于各自附着(attach)的进程是共享的,这些进程可以很方便的通过这块共享内存上的共有数据进行通信。因此,顾名思义,共享内存就是进程之间共享的一组内存段。当一个进程附着到一块共享内存上后,它得到一个指向这块共享内存的指针;该进程可以像使用其他内存一样使用这块共享内存。当然,由于这块内存同样会被其他进程访问或写入,所以必须要注意进程同步问题。
参考如下代码,这是UNIX系统上使用共享内存的一般方法(注:本文调用的是POSIX函数):

Also tagged ,

STL容器放入共享内存

STL可以说是C++的重要的组成部分,它提供了一系列方便使用的容器,可以供我们存放数据,节省了很多开发时间。不过如果打算在多个进程之间共享一个STL容器,却常常会遭遇一些困难。比如你正在使用一个map,一般的IPC方法,可能下意识的你就会选择使用共享内存,如果可以把这个map放入一块共享内存供多个进程操作,那该多方便呢。然而问题却没这么简单,由于STL帮我们完美的封装好了map的内部方法,包括内存分配方案,这也导致了我们没法把map直接简单的用placement new放置到已知的共享内存上。
要完成这个任务就需要我们自己实现一个基于共享内存的allocator,替换map默认的allocator,在这个allocator中实现map的内存分配方案。关于allocator的讲解可以看侯捷的《STL源码剖析》这本书,写一个简单的allocator直接套下边的模板就可以了,主要实现的是这几个函数:

max_size() 容器的最大容量
allocate(num) 为num个元素分配内存
construct(p) 将p所指的元素初始化
destroy(p) 销毁p所指向的元素
deallocate(p, num) 收回p所指的num个空间

Also tagged

STL小记

使用hash_map
这两天写段程序, 需要用到hash_map, 于是跑到 sgi 上学习了一下, 结果郁闷的发现给出的例子在Mac和Linux下都没法编译通过. 因为hash_map并没有进入C++的STL标准, 于是破费了点周折才发现hash_map位于/usr/include/c++/4.0.0/ext目录下, 并且在__gnu_gxx的名字空间中. 所以要在Mac或者Linux下使用hash_map, 需要加上该名字空间.
这里有个例子:

Also tagged ,