2014-02-10 84 views
1

我试图在两个程序之间共享一个类的实例。这是一个荣耀的生产者消费者问题;然而,为了抽象的目的,我在班上加了一个互斥体。在堆中共享对象

我见过在进程之间共享结构的实例,但这通常涉及到一个fork。我想保持这些流程是分开的,因为它们会做两件不同的事情,所以程序\代码段的一半将在每个流程中浪费。

它可能比试图解释更容易显示。

class my_class 
{ 
    private: 
    sem_t mutex; 
    data_type *my_data; //just some linked list 
    fstream some_file; 
    public: 
    my_class(); 
    data_type* retrieve(); 
    void add(string add); 
}; 

my_class::my_class() 
{ 
    my_data = new data_type(); 
    sem_init(&mutex, 0, 1); 
    my_file.open("log", ios::out); 
} 

data_type* my_class::retrieve() 
{ 
    data_type *temp = NULL; 
    sem_wait(&mutex); 
    if(my_data -> next != NULL) 
    { 
    temp = my_data; 
    my_data = my_data -> next; 
    } 
    sem_post(&mutex); 
    return my_data; 
} 

void my_class::add(string data) 
{ 
    data_type *temp = new data_type(); 
    temp -> data = data; 
    data_type *top; 
    sem_wait(&mutex); 
    top = my_data; 
    while(top -> next -> next) //adds it to the end. The end's next is set to NULL 
    { 
    top = top -> next; 
    } 
    top -> next = temp; 
    my_file << name << "\n"; 
    sem_post(&mutex); 
} 

什么我真正需要的是分享这一类为指针的实例的方式。这样,我就可以拥有可以访问此实例的线程。我想因为我想要做多少共享,它需要堆积如山,而不是堆栈。

我不会考虑制作它自己的程序,然后使用网络我\ o互动,因为它是多么简单。不用说,这不完全是我正在做的;但是我认为我已经做了一个简单的\通用的示例,如果这可以解决,那么我可以很容易地将它应用到我的解决方案,它可能会帮助其他人。

同样,我正在寻找一种方法在两个独立的进程之间共享此代码的一个实例。

我不知道这是否可以完成,因为类中有一个链表,更不用说它里面的文件了。如果可以的话,那么它的堆和文件表就会填满(两者?)。

编辑:

感谢您的帮助迄今为止;然而,值得指出的是,这两个进程可能不会同时运行。一个用作守护进程,另一个间歇出现。两个程序都已经有线程,所以这就是为什么我想在堆上做的。

+0

首先不会有腰,因为叉具有超级奶牛的力量:过程将共享代码。第二个叉不会导致共享内存,您需要分配共享内存。 –

+0

查找命名共享内存。 –

+1

http://ricackoverflow.com/questions/13274786/how-to-share-memory-between-process-fork –

回答

1

您不能共享进程之间的堆上的内存。使用mmap()MAP_ANON | MAP_SHARED可以共享整个页面,但不能在堆上共享。使用shm_open等,你可以共享其他对象,但又不是在堆上。

也许你想要的是线程。这些将允许您共享堆上的项目。

我认为你对fork()的理解是乱码。 fork()将导致程序在内存中的写入时复制图像。由于您的代码不会被写入,所以如果您不使用exec(),它将只使用一个物理内存副本。如果你的exec()是你的程序的不同版本(例如,如果生产者exec()是消费者),那么它可能比在全部位置和fork()中都更少。在任何一种情况下,你都会有某种IPC的开销。线程似乎是一个更好的解决方案。

+0

我同意。虽然在Linux上,线程和进程之间的区别并不是那么明显。进程没有MS-Windows的性能问题。共享所有内存的2个进程和2个线程的进程之间几乎没有区别。 –

+0

线程将无法工作,因为这两个进程可能不会同时运行。我想我会编辑原来的问题来反映这一点。 – SailorCire