У меня очень большая файловая память, сопоставленная в 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» может обновить следующие два байта.Другими словами, потоки могут писать по адресам, очень близким друг к другу, но они всегда пишут по разным адресам без наложения.