Мне было интересно, можно ли выполнять многопоточные записи в один файл, используя сопоставленные с памятью файлы и следя за тем, чтобы два потока не записывали в одну и ту же область (например, путем чередования фиксированного размера).записи), тем самым устраняя необходимость синхронизации на уровне приложения, то есть без использования критических секций или мьютексов в моем коде.
Однако, немного погуглив, я все еще не уверен.Эта ссылка от Microsoft гласит:
Во-первых, очевидна экономия ресурсов, поскольку оба процесса совместно используют как физическую страницу памяти, так и страницу жесткого диска, используемую для резервного копирования.файл с отображением в памяти.Во-вторых, существует только один набор данных, поэтому все представления всегда связаны друг с другом.Это означает, что изменения, внесенные на страницу в отображенном в память файле через представление одного процесса, автоматически отражаются в общем представлении отображенного в память файла в другом процессе.По сути, Windows NT не требуется вести какую-либо специальную бухгалтерию для обеспечения целостности данных обоим приложениям.
Но относится ли это к потокам, принадлежащим одному и тому же процессу?Это было бы правдоподобно (поскольку мои записи не пересекаются), но я не знаю достаточно о базовой реализации отображения памяти (например, что делает бухгалтерия ОС), чтобы быть уверенным.
Пример использования,где myFunction
выполняется каждым потоком:
// crt - index of current thread, in 0..n-1
// n - thread count
// memArea - pointer to memory location obtained from mapping a file
void myFunction(int crt, int n, int*memArea){
for (int i=1; i<512; i++)
memArea[ ( sizeof(int)*( n*i + crt ) ] = n*i+crt;
}
Если бы я должен был выполнить это, дождаться окончания потоков, разархивировать файл и выйти, получу ли я файл, содержащий последовательные целые числа?
Буду признателен за информированный ответ.