Являются ли отображаемые в памяти файлы потокобезопасными? - PullRequest
4 голосов
/ 07 ноября 2011

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

Однако, немного погуглив, я все еще не уверен.Эта ссылка от 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;
}

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

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

Ответы [ 2 ]

4 голосов
/ 07 ноября 2011

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

2 голосов
/ 07 ноября 2011

Но относится ли это к потокам, принадлежащим к одному и тому же процессу?

Да. Если один поток изменяет часть данных в отображении, то все остальные потоки немедленно видят это изменение.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...