我使用Boost使用C ++映射了非常大的文件内存。
我需要用新数据更新文件的分散部分。准备数据需要很长时间,因此我正在使用多个线程。每个线程准备一些数据,然后将其写入内存映射文件。每个线程都会写入文件中的不同区域。
文件中的数据被破坏了。
如果我使用多个线程将文本写到普通文本文件中,则希望输出被破坏。但是我没想到会在内存映射文件中发生这种情况(我想我想是因为看起来好像我只是在写单个数组元素,而不是写在有缓冲的文件中)。
即使单个线程正在访问不同的数组元素,也不可能对内存映射文件进行并行写入吗?我需要使用互斥锁吗?
更新#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”可能会更新接下来的两个字节。换句话说,线程可以写入彼此非常接近的地址,但是它们始终写入不重叠的不同地址。