簡體   English   中英

C編程:如何使用mmap(2)通過多個線程並行讀取文件?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM