关于多进程共享一个链表的问题

最近遇见一个麻烦事情,就是多个进程之间共享一个链表,怎么办?

最开始我的想法是共享内存+信号量机制。就是把链表的头结点共享,然后大家都可以通过这个头结点来对这个链表进行操作了。但是事实是错误额。运行程序发现共享不了链表。那该怎么办呢?

网上查资料,有很多这样的问题。解决办法也是多种多样,但是对于我来说都是不能满足自己的要求。在这儿总结一下网上的说法吧。

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、消息队列应该都知道,这个其实的话也可以算作是一个链表。但是是数组链表。没有传统的指针指向下一个数据。有指针就错误。因为毕竟共享存储,是事先指定了空间的,如果用指针指向下一个数据,那么指针会不会越界了呢?说不清。


综上,传统的链表共享行不通。如果硬要,那么每一个链表都要共享存储一下也是可以,但是这样会不会更加麻烦了呢?得不偿失了吧。但是我的问题该怎么解决呢?一个链表结点里面有复杂的结构体呢。想来不容易。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值