在堆中共享对象

Sharing an Object in the Heap

本文关键字:对象 共享      更新时间:2023-10-16

我试图在两个程序之间共享一个类的实例。这是一个荣耀的生产者-消费者问题;但是,出于抽象的目的,我在类中放置了一个互斥对象。

我见过进程之间共享结构的例子,但这通常涉及一个分叉。我想把进程分开,因为它们将做两件不同的事情,所以每个进程将浪费一半的程序\代码段。

展示可能比解释更容易。

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);
}

我真正想要的是一种将这个类的实例作为指针共享的方法。这样,我就可以拥有可以访问此实例的线程。我认为,由于我想做多少共享,它需要放在堆上,而不是堆栈上。

我不会考虑把它作为自己的程序,然后使用网络进行交互,因为它很简单。不用说,这并不完全是我正在做的;然而,我认为我已经做了一个简化的\通用的例子,如果这个问题可以解决,那么我可以很容易地将其应用于我的解决方案,它可能会帮助其他人。

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

我不知道这是否可以做到,因为类中有一个链表,更不用说其中有一个文件了。如果可以,那么它会填充谁的堆和文件表(两者都有?)。

编辑:

感谢到目前为止的帮助;但是,值得指出的是,这两个进程可能不会同时运行。一个充当守护进程,另一个将间歇性出现。这两个程序都已经有了线程,所以这就是为什么我想在堆上执行它。

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

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

我认为你对fork()的理解是错误的。fork()将在内存中生成程序的写时复制映像。由于您的代码不会被写入,如果您不使用exec(),它将只使用物理内存的一个副本。如果exec()是不同版本的程序(例如,如果生产者exec()是消费者),那么它的内存效率可能比将所有内容都放在一个位置并使用fork()要低。在任何一种情况下,你都会有某种IPC的开销。这里的线程似乎是一个更好的解决方案。