Я спросил this вопрос о том, как читать текстовый файл, начиная со смещения pos
, на смещение end
до mmap()
. В частности, текстовый файл считывается нескольких потоков со следующим кодом:concurrent mmap() на части текста
void getNextKeyValue() {
key = pos;//value is the actual file offset
char *mmappedData = (char*) mmap(NULL, end-pos+1, PROT_READ, MAP_PRIVATE , fd, pos);
assert(mmappedData != NULL);
value.assign(mmappedData);
assert(munmap(mmappedData, end-pos+1)==0);
morePairs = false;
}
нерегистрируемой переменными объявляются и инициализируются где-то в другом месте. Что, кстати, следующий код читал весь текстовый файл, а не со смещения pos
до end
.
В зависимости от программы программа прерывается (без ошибок) с несколькими потоками, в то время как она завершается корректно только одним потоком, который читает весь файл.
UPDATE:
После this примера (вы можете попробовать мою версию, используя cout
InstEd из write
, HERE с ./main main.cpp 10 20
) я узнал, что то, что я делаю неправильно, что я напечатал считанные данные через cout<<mmappedData<<endl
, Если вы используете , то печатается правая часть текста.
То, что я до сих пор не понимаю почему весь текст хранится внутри mmappedData
(или addr
после связанного примера): mmap
использования четко говорится, что количество прочитанных байт являются вторым аргументом, начиная с 4-го арга ,
Почему карта и размонтирование? Невозможно ли просто сопоставить один раз и позволить нескольким потокам читать один и тот же отображаемый указатель? – jxh
Поскольку это для проекта paralll, разные потоки могут читать параллельно различные части файла. Так что (теоретически) это более эффективно. – justHelloWorld
Эм, извините, но я не знаю, что такое NUMI, поэтому я не понял ваш комментарий. – justHelloWorld