我对共享内存和posix比较陌生,因此在进行一些基础工作时遇到了困难。
我有一些如下所示的节点:
typedef struct Node{
int node_id;
int process_id;
struct Node* next;
}Entry;
我创建了一个指针数组,每个位置都可以有一个链表。它作为哈希表运行,并且有两个正在编辑它的进程。
因此,数组的每个位置都有元素的机会,但也可能有很多空元素。
我已经将指针数组放入共享内存中,而不是列表节点。所以这是一个大问题,因为进程1的节点对进程2不可见,反之亦然,正如下面所示。
int shmid = shmget(ftok("./main.c", 30), (size_t)(node_num*sizeof(Entry *)), 0666 | IPC_CREAT);
if(shmid == -1){
fprintf(stderr, "shmget error");
exit(EXIT_FAILURE);
}
void* shared_memory = (void*)shmat(shmid, (void*)0, 0);
if(shared_memory == (void*)-1){
frpintf(stderr, "shmat error");
exit(EXIT_FAILURE);
}
Entry** HashTable = (Entry **)shared_memory;
这个表将插入和删除节点的两个过程结合在一起。我看到了一个解决方案,但它要求列表具有固定的大小,其中池中的所有节点都在共享段内,但在我的情况下,它不是固定的,因为数字是在执行期间作为参数给出的。
我的数组作为哈希表,并且可以放置的项目受到限制,所以让我担心的是:
1. 我将不得不从一开始就在段中放置X个节点并通过哈希函数连接它们。 2. 如果我使用shmget和nodes_num*sizeof(Entry)作为参数来创建它们,我应该如何分配它们?因为我认为指针数组在实现中扮演着重要角色,因为很多指针是空的。
那么,在共享内存段中实现这个哈希表的最佳方法是什么?
编辑#1
评论给了我一个想法,但我仍然不知道它是否是一个好的实现。
我的想法是保留我已经有的指针数组,并在共享内存中添加另一个数组,
大小为nodes_num;
,然后使第一个数组指向第二个包含所有数据(节点)的数组的特定位置。int shmid2 = shmget(ftok("./main.c", 30), (size_t)(node_num*sizeof(Entry )), 0666 | IPC_CREAT);
if(shmid2 == -1){
fprintf(stderr, "shmget error");
exit(EXIT_FAILURE);
}
void* shared_memory2 = (void*)shmat(shmid, (void*)0, 0);
if(shared_memory2 == (void*)-1){
frpintf(stderr, "shmat error");
exit(EXIT_FAILURE);
}
Entry* Data = (Entry *)shared_memory2;
Entry
数组应该就足够了。 - user58697