我正在尝试在两个程序之间共享一个类的实例。这是一个美化生产者的消费者问题;但是,出于抽象的目的,我在课堂上放了一个互斥体。
我见过在进程之间共享结构的实例,但这通常涉及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);
}
我真正想要的是一种将此类的实例作为指针共享的方法。这样,我就可以拥有可以访问此实例的线程。我认为,由于我想要共享多少共享,它需要进入堆而不是堆栈。
我不会考虑将其作为自己的程序,然后使用网络i \ o进行交互,因为它有多么简单。不用说,这不是我正在做的事情;但是我认为我已经制作了一个简化的\ generic足够的例子,如果可以解决这个问题,那么我可以很容易地将它应用到我的解决方案中,这可能对其他人有帮助。
同样,我正在寻找一种在两个独立进程之间共享此代码的一个实例的方法。
我不知道是否可以这样做,因为该类中有一个链表,更不用说文件了。如果可以,那么它的堆和文件表是否填充(两者都是?)。
编辑:
感谢迄今为止的帮助;但是,值得指出的是,这两个进程可能无法同时运行。一个用作守护进程,另一个用于间歇性出现。两个程序都已经有线程,所以这就是我想在堆上执行它的原因。
答案 0 :(得分:1)
您无法在进程之间共享堆上的内存。将mmap()
与MAP_ANON | MAP_SHARED
一起使用,您可以共享整个页面,但不能在堆上共享。使用shm_open
等可以共享其他对象,但不能再堆栈。
也许你想要的是线程。这些将允许您在堆上共享项目。
我认为您对fork()
的理解是乱码。 fork()
将在内存中生成程序的写时复制映像。由于您的代码不会被写入,如果您没有exec()
,它将仅使用一个物理内存副本。如果你exec()
你的程序的不同版本(例如,如果生产者exec()
是消费者),它可能比更少内存效率高于在一个地方拥有它fork()
ING。在任何一种情况下,您都将获得某种IPC的开销。这里的线程似乎是一个更好的解决方案。