在堆中共享对象
Sharing an Object in the Heap
我试图在两个程序之间共享一个类的实例。这是一个荣耀的生产者-消费者问题;但是,出于抽象的目的,我在类中放置了一个互斥对象。
我见过进程之间共享结构的例子,但这通常涉及一个分叉。我想把进程分开,因为它们将做两件不同的事情,所以每个进程将浪费一半的程序\代码段。
展示可能比解释更容易。
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的开销。这里的线程似乎是一个更好的解决方案。
- 如何从具有移动语义的类对象中生成共享指针
- 使用共享指针的函数调用,其对象应为 const
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 在共享缓冲区内存中创建 ::std::string 对象
- 如何创建一个共享对象与另一个.所以在Cmake
- 内联函数的函数本地静态对象是否在共享对象文件之间共享?
- 有没有办法列出所有共享内存对象的名称?
- 共享的从属对象
- 在 Android Studio 中使用 C++ 共享对象时出现问题
- 共享对象、符号、C/C++ 库链接和加载
- ./main:加载共享库时出错:libopencv_highgui.so.4.0:无法打开共享对象文件:没有这样的文件或
- 在 win32 上生成 R 包:无法加载共享对象 (.dll)
- C++对象共享属性 - 使用指针或引用
- 如何测试共享对象/共享库已正确编译
- 创建对象共享指针以共享指针为参数
- 限制C++中虚拟基类的对象共享
- 在Ada95中跨共享库/对象共享数据
- 这种线程间对象共享策略是否合理
- 如何更改对象共享指针指向,而它被其他线程占用
- 初始化仅由一组对象共享的静态变量