Мне было интересно, можно ли выполнять многопоточную запись в один файл с помощью файлов с отображением памяти , и убедитесь, что два потока не пишут в одну и ту же область (например, чередуя записи фиксированного размера), тем самым устраняя необходимость синхронизации на уровне приложения, то есть без использования критических секций или мьютексов в моем коде.
Однако, немного погуглив, я все еще не уверен. В этой ссылке от 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;
}
Если бы мне пришлось запустить это, дождаться завершения потоков, отменить сопоставление файла и выйти, получился бы я с файлом, содержащим последовательные целые числа?
Буду признателен за информированный ответ.