[英]C programming: How to use mmap(2) to read file parallel by multiple threads?
我正在嘗試編寫多線程代碼以使用mmap(2)讀取固定塊中的文件並計算字數。 每個線程都在文件的單獨部分上工作,從而可以更快地處理文件。 我可以使用mmap(2)單線程讀取文件。 當線程數超過一個時,它將失敗並出現分段錯誤。
for( unsigned long cur_pag_num = 0; cur_pag_num < total_blocks; cur_pag_num++ ) {
mmdata = mmap(
NULL, PAGE_SIZE, PROT_READ, MAP_PRIVATE, fd, (fileOffset + (cur_pag_num * PAGE_SIZE))
);
if (mmdata == MAP_FAILED) printf(" mmap error ");
unsigned long wc = getWordCount( mmdata );
parserParam->wordCount +=wc;
munmap( mmdata, PAGE_SIZE );
}
unsigned long getWordCount(char *page){
unsigned long wordCount=0;
for(long i = 0 ; page[i] ;i++ ){
if(page[i]==' ' || page[i]=='\n')
wordCount++;
}
return wordCount;
}
我發現getWordCount(mmdata)
內的代碼失敗。 我在這里做錯了什么?
注意:文件大小大於主存儲器的大小。 因此,讀取固定大小的塊( PAGE_SIZE
)。
getWordCount
正在映射的頁面外部訪問,因為循環在找到空字節時停止。 但是mmap()
不會在映射頁面之后添加一個空字節。 您需要將映射頁面的大小傳遞給函數。 當到達該索引或空字節時,它應該停止(如果文件的長度不足以填滿頁面,則頁面的其余部分將為零)。
for( unsigned long cur_pag_num = 0; cur_pag_num < total_blocks; cur_pag_num++ ) {
mmdata = mmap(
NULL, PAGE_SIZE, PROT_READ, MAP_PRIVATE, fd, (fileOffset + (cur_pag_num * PAGE_SIZE))
);
if (mmdata == MAP_FAILED) printf(" mmap error ");
unsigned long wc = getWordCount( mmdata, PAGE_SIZE );
parserParam->wordCount +=wc;
munmap( mmdata, PAGE_SIZE );
}
unsigned long getWordCount(char *page, size){
unsigned long wordCount=0;
for(long i = 0 ; i < size && page[i] ;i++ ){
if(page[i]==' ' || page[i]=='\n')
wordCount++;
}
return wordCount;
}
順便說一句,您的方法還有另一個問題:跨越頁面邊界的單詞將被計數兩次。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.