Являются ли файлы с отображением памяти потокобезопасными

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

Однако после небольшого поиска в Google, Я все еще не уверен.В этой ссылке от 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;
}

Если бы я запустил это, дождитесь завершения потоков, отключите отображение файла и выйдите, я бы получил файл, содержащий последовательные целые числа?

Буду признателен за осознанный ответ.

5
задан Vlad 7 November 2011 в 12:08
поделиться