многопоточность — C ++ mmap набора

У меня есть программа на C ++, в которой я использую fork (), но мне нужно иметь возможность совместно использовать объект, который может быть прочитан и записан, между родительским процессом и его дочерними элементами. Из моего чтения онлайн кажется, что 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 в настоящее время выдает ошибку:

ошибка: недопустимое преобразование из âvoid * âstd :: set, std :: allocator> * â

Кто-нибудь знает, что это значит / как это исправить?

Заранее спасибо!

1

Решение

STL классы std :: vector<> и std :: set<> выделить память используя оператор new ().
Оператор new () выделяет память из кучи процесса.
Куча не находится в разделяемой памяти, поэтому другой процесс не может получить доступ к чему-либо, выделенному одним процессом.

У вас есть пара вариантов. Во-первых, сделать std :: allocator<> что выделяет из разделяемой памяти.

Второе (и мое предпочтение) — не использовать объекты в общей памяти, которые используют указатели.
Это в значительной степени исключает что-либо из STL.

Вам также понадобится мьютекс для управления доступом к общим данным, чтобы два процесса
не портите ваши общие данные.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]