[英]C++ mmap of a set
我有一个使用fork()的C ++程序,但是我需要能够共享一个可以在父进程及其子进程之间进行读写的对象。 从我的在线阅读看来,mmap是实现此目的的方法。 这是我所拥有的:
enum messageType {New = 0, Old = 1, No_Message = 2};
typedef struct {
enum messageType type;
unsigned int senderID;
char message[100];
} StoredMessageData;
struct StoredMessage {
unsigned int recipientID;
vector<StoredMessageData> messages;
StoredMessage(const unsigned int& intRecipient = 0, const vector<StoredMessageData>& data = vector<StoredMessageData>())
: recipientID(intRecipient), messages(data)
{
messages.reserve(10);
}
bool operator<(const StoredMessage& compareTo) const
{
return recipientID < compareTo.recipientID;
}
bool operator==(const StoredMessage& compareTo) const
{
return recipientID == compareTo.recipientID;
}
};
然后在主要:
set<StoredMessage> * msgs;
msgs = mmap(NULL, sizeof(set<StoredMessage>), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0);
后来我主要使用fork()。
我的问题分为2部分:
1)一组大小可变,并且我已经知道在每个分支过程中,我都希望能够添加一个StoredMessage并将一个StoredMessageData添加到StoredMessage中的向量。 但是,我不确定mmap是否可以处理此问题……难道它不只是为基础对象分配足够的空间吗? 我可以使它分配足够的空间以允许我进行这些添加吗?
2)上面来自main的代码当前抛出错误:
错误:从“无效*”到“ std :: set,std :: allocator> *â”的无效转换
有谁知道这意味着什么/如何解决?
先感谢您!
STL类std :: vector <>和std :: set <>使用运算符new()分配内存。 运算符new()从进程堆中分配内存。 堆不在共享内存中,因此一个进程分配的任何内容都不能被另一个进程访问。
您有两种选择。 首先是制作一个std :: allocator <>从共享内存分配。
第二(也是我的喜好)是不要在共享内存中使用指针的任何对象。 这几乎消除了STL中的任何内容。
您还将需要一个互斥锁来控制对共享数据的访问,因此这两个进程不会破坏您的共享数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.