linux中如何用shmget在共享内存中分配一个Map类型的空间?

OracleJ 2012-04-17 05:12:33
在共享内存中分配这种类型的空间主要是为了其它进程使用。其它进程要在这个共享map中查找元素,如果存在就进行修改,不存在插入,然后在一定的时间内把Map中得数据存入到数据库中。

只所以在共享内存中设计成map类型就是为了查找元素快,方便各个进程都可以操作这个变量。

请高手帮忙如何在共享内存中分配Map类型的空间?(或者有其它高效方案也行,针对这样的需求。)谢谢!
...全文
459 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
bulijun1987 2012-04-20
  • 打赏
  • 举报
回复
LZ上面的该过之后的代码中:
dataInfo[0-count]的值都是一样的。
后面的代码:
//初始化 结构体数组
for(int i = 0;i < count;i++){
//初始化共享内存 这里为什么不能用dataInfo[i]这个(对这个进行初始化,最后dataInfo[i]
都是同一个值),改成tempDataInfo[i] 值的初始化就正确,请高手讲解?
strcpy(tempDataInfo[i].instrumentID,"IF1201");//IF1201 还有其他的值 这里只是一个代表。每一个值都不相同。
}

如果此处要用dataInfo[i]的话只会初始化内存中的第一个结构
OracleJ 2012-04-18
  • 打赏
  • 举报
回复
对上面的代码进行了修改,目前是执行成功,接下来就是对这个结构体数组进行管理了。
typedef struct _KLineInfo{
char instrumentID[32];//把这个看成key键
double OpenPrice;
double HighestPrice;

_KLineInfo(){
memset(instrumentID,0,sizeof(instrumentID));
OpenPrice = 0.f;
HighestPrice = 0.f;
}
}KLineInfo;

int count = 255;//结构体数组的长度。
//定义指针数组
KLineInfo *dataInfo[count];

int shmid;
//分配内存空间
if((shmid = shmget((key_t)1234,sizeof(KLineInfo)*count,0666|IPC_CREAT)) == -1){
perror("shmget is error!");
}
for(int i = 0;i < count;i++){
dataInfo[i] = (KLineInfo *)shmat(shmid,0,0);
}
KLineInfo *tempDataInfo;
//把内存的首地址给这个指针变量
tempDataInfo = (KLineInfo *)shmat(shmid,0,0);

//初始化 结构体数组
for(int i = 0;i < count;i++){
//初始化共享内存 这里为什么不能用dataInfo[i]这个(对这个进行初始化,最后dataInfo[i]
都是同一个值),改成tempDataInfo[i] 值的初始化就正确,请高手讲解?

strcpy(tempDataInfo[i].instrumentID,"IF1201");//IF1201 还有其他的值 这里只是一个代表。每一个值都不相同。
}
OracleJ 2012-04-18
  • 打赏
  • 举报
回复
非常感谢楼上2位的解释。根据楼上2位的思路,目前我设计了一个结构体,首先创建这个结构体数组,因为这个数组的最大长度,还有所谓的key键的值已经固定。所以我就提前初始化这个结构体的长度和key值。在编译的时候没有问题,当运行的时候出现了问题。
typedef struct _KLineInfo{
char instrumentID[32];//把这个看成key键
double OpenPrice;
double HighestPrice;

_KLineInfo(){
memset(instrumentID,0,sizeof(instrumentID));
OpenPrice = 0.f;
HighestPrice = 0.f;
}
}KLineInfo;

int count = 255;//结构体数组的长度。
KLineInfo *dataInfo;

int shmid;
if((shmid = shmget((key_t)1234,sizeof(dataInfo)*count,0666|IPC_CREAT)) == -1){
perror("shmget is error!");
}
dataInfo = (KLineInfo *)shmat(shmid,0,0);

//初始化 结构体数组
for(int i = 0;i < count;i++){
//只要对结构体中的instrumentID进行下面的初始化就在运行时出现错误?
strcpy(dataInfo[i].instrumentID,"IF1201");//IF1201 还有其他的值 这里只是一个代表。

}
//然后对这个初始化玩的数组进行排序。
//进行查找的时候用的时2分查找,毕竟数据量最多也就600.



OracleJ 2012-04-18
  • 打赏
  • 举报
回复
楼上的高手能给一个详细的实例吗?或者提供一个参考的文章地址也行。谢谢
qq120848369 2012-04-18
  • 打赏
  • 举报
回复
以前封装的共享内存哈希表是采取多级哈希的办法,整个线性内存分为3段,每一段内有多块,每一块的大小固定,足够容纳你的key-val即可。三段的快数都取素数,并且递增。

之后插入数据就是按照1段快数散列,冲突则散列到2段,2段冲突散列到3段,删除操作也类似了,自己设计。

这样做的好处就是高效,不用移动内存,只需要每次计算偏移量即可,其他设计方案都是可行的,比如就是一段哈希表,冲突了往后找都行,记住用偏移量就可以了,甚至可以做成链表或者树都是可以的,只要你不嫌麻烦,指针换成偏移量而已,初始化将所有的块串成free链表,需要结点就从free链里取。
gettext 2012-04-17
  • 打赏
  • 举报
回复
map数据存一个文件里, 在用mmap映射到共享内存。 关键是数据结构如何定,共享内存中不能用指针。
昵称很不好取 2012-04-17
  • 打赏
  • 举报
回复
用shmat取得内存地址之后如何解释是程序的事情,程序按照map内存管理的方式解释就是了
关键是设计好map

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧