C++ mmap of a set
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);
后来在 main 中我使用 fork()。
我的问题分为两部分:
1)一个集合的大小是可变的,我已经知道在每个分叉进程中,我希望能够添加一个存储消息并将一个存储的消息数据添加到存储消息中的向量中。但是,我不确定mmap是否可以处理此问题...它不只是为基本对象分配足够的空间吗?我是否可以使其分配足够的资源以允许我进行这些添加?
2)来自main的上述代码当前抛出错误:
错误:从"void*"到"std::set"、"std::分配器>*"的转换无效
有谁知道这意味着什么/如何解决它?
提前谢谢你!
STL 类 std::vector<> 和 std::set<> 使用运算符 new() 分配内存。运算符 new() 从进程堆中分配内存。堆不在共享内存中,因此一个进程分配的任何内容都不能被另一个进程访问。
你有几个选择。 首先是创建一个 std::分配器<>它从共享内存中分配。
其次(也是我的偏好)是不要在共享内存中使用任何使用指针的对象。这几乎消除了STL中的任何内容。
您还需要一个互斥锁来控制对共享数据的访问,以便两个进程不要损坏您的共享数据。
相关文章:
- Usages of std::move
- 为什么我无法更改"set<set>"循环中的值<int>
- 对于set上的循环-获取next元素迭代器
- 使用 [] 运算符时"binding reference of type discards qualifiers"
- 如何处理 c++ 中类实现中的"invalid use of non-static data member"?
- 在声明中合并两个常量"std::set"(不是在运行时)
- 具有变量Number of Arguments的std::函数的矢量
- Capacity of a deque
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- Deprecation of _writeBarrier()
- constexpr begin of a std::array
- 将 std::set 与基于键的比较器一起使用
- 如何调整 std::vector of Eigen::MatrixXd 的大小
- C++ "error: invalid use of void expression"
- 如何使用set实现无序数据结构?
- 将 std::set 分配给 2D std::vector of ints
- Static constexpr of set
- 在C++中实现Set of octets类
- C++ mmap of a set
- A set of weak_ptr