最近遇见一个麻烦事情,就是多个进程之间共享一个链表,怎么办?
最开始我的想法是共享内存+信号量机制。就是把链表的头结点共享,然后大家都可以通过这个头结点来对这个链表进行操作了。但是事实是错误额。运行程序发现共享不了链表。那该怎么办呢?
网上查资料,有很多这样的问题。解决办法也是多种多样,但是对于我来说都是不能满足自己的要求。在这儿总结一下网上的说法吧。
1、改用线程。线程可以共享,毕竟他们是在一个进程的空间之中。
2、改变传统链表的*next。改用数组或者是shmat获取。网上有这么一个例子。http://www.it165.net/pro/html/201208/3548.html。这样的话,通过新建的shmid标志来进行遍历寻找。代码我也借用一下:
* Filename: writer.c
*
* Description: show create linked list in share memory
*
* Version: 1.0
* Created: 08/20/2012 09:55:21 PM
* Revision: none
* Compiler: gcc
*
* Author: royn.wang.renyuan@gmail.com
* Organization:
*
* */
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
//The memory id for the head pointer
#define KEY 5566
//we store the memory id (shmid) as the next, instead of a pointer.
//if you use the *node as next, you will not be able to read it in other thread. I do not know why
typedef struct node{
int value;
int next;
} *ptrnode;
/*
* === FUNCTION ======================================================================
* Name: main
* Description:
* www.it165.net */
int
main ( int argc, char *argv[] )
{
//initialzie the memory by shmget. We use a fixed KEY for the head node.
int shmid = shmget(KEY, sizeof(struct node), IPC_CREAT|0666);
//format the node as the proper data type, now you can use it just like the memory initialized by malloc.
ptrnode cur = (ptrnode)shmat(shmid, NULL, 0);
int i;
for( i=0 ; i<10 ; i++ )
{
printf ( "write %d with %d\n", shmid, i );
cur->value = i;
// should use shmget to create the node
// do not use malloc. Memory created by malloc can be only read by the thread who created in.
shmid = shmget(0, sizeof(struct node), IPC_CREAT|0666);
cur->next = shmid;
cur = (ptrnode)shmat(shmid, NULL, 0);
}
return EXIT_SUCCESS;
} /* ---------- end of function main ---------- */
这样虽然也能做到,但是对于复杂一点的结构体的链表,就非常不好了。
3、用一个进程专门来进行链表的操作,其他进程只是传输一些控制符号等。因为链表只是在一个进程中有操作,就不存在共享不共享的问题了。这样的话也就远离了主题了吧。
4、消息队列应该都知道,这个其实的话也可以算作是一个链表。但是是数组链表。没有传统的指针指向下一个数据。有指针就错误。因为毕竟共享存储,是事先指定了空间的,如果用指针指向下一个数据,那么指针会不会越界了呢?说不清。
综上,传统的链表共享行不通。如果硬要,那么每一个链表都要共享存储一下也是可以,但是这样会不会更加麻烦了呢?得不偿失了吧。但是我的问题该怎么解决呢?一个链表结点里面有复杂的结构体呢。想来不容易。