Параллельная запись в отображенный в память файл - PullRequest
0 голосов
/ 14 февраля 2019

У меня очень большая файловая память, сопоставленная в C ++ с использованием Boost.

Мне нужно обновить отдельные части файла новыми данными.Подготовка данных занимает много времени, поэтому я использую несколько потоков.Каждый поток подготавливает некоторые данные и затем записывает их в файл отображения памяти.Каждый поток записывает в отдельную область в файле.

Данные в файле искажаются.

Если бы я использовал несколько потоков для записи текста в обычный текстовый файл, я ожидал бывывод, который будет искажен.Однако я не ожидал, что это произойдет в файле с отображенной памятью (наверное, я так и думал, потому что, похоже, я просто пишу в отдельные элементы массива, а не в файл, где есть буферизация).

Разве невозможно выполнять параллельные записи в файл, отображенный в память, даже когда отдельные потоки обращаются к отдельным элементам массива?Нужно ли использовать мьютекс?

Обновление # 1 Я создаю сопоставленную область следующим образом:

namespace bip = boost::interprocess;
bip::file_mapping mapping(data_info.datafile.c_str(), bip::read_write);
bip::mapped_region mapped_region(mapping, bip::read_write);
unsigned char const* const mem_mapped_data = static_cast<unsigned char*>(mapped_region.get_address());
unsigned char *ptr = const_cast<unsigned char*>(mem_mapped_data);

Затем я передаю указатель (* ptr) каждому потоку, который обновляет данные.

Например, поток «A» может обновить 2 байта по заданному адресу, а поток «B» может обновить следующие два байта.Другими словами, потоки могут писать по адресам, очень близким друг к другу, но они всегда пишут по разным адресам без наложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...