2012-06-29 69 views
1

我想問的是一些大代碼的一部分,但我會盡量縮短它的大小。我將首先從我的代碼中解釋相關的代碼片段,然後解釋我遇到的錯誤。錯誤訪問多線程程序中的文件指針

main.c主要功能內:

cilk_for (line_count = 0; line_count != no_of_lines ; ++line_count) 
{ 
    //some stuff here 
    for (j=line_count+1; j<no_of_lines; ++j) 
    { 
     //some stuff here 
     final_result[line_count][j] = bf_dup_eleminate (table_bloom[line_count], file_names[j], j); 
     //some stuff here 
    } 
    //some stuff here 
} 

bf_dup_eleminate函數從bloom-filter.c文件:

int bf_dup_eleminate (const bloom_filter *bf, const char *file_name, int j) 
{ 
    int count=-1; 
    FILE *fp = fopen (file_name, "rb"); 
    if (fp) 
    { 
     count = bf_dup_eleminate_read (bf, fp, j); 
     fclose (fp); 
    } 
    else 
    { 
     printf ("Could not open file\n"); 
    } 
    return count; 
} 

bf_dup_eleminate_readbloom-filter.c文件:

int bf_dup_eleminate_read (const bloom_filter *bf, FILE *fp, int j) 
{ 
    //some stuff here 
    printf ("before while loop. j is %d ** workder id: **********%d***********\n", j, __cilkrts_get_worker_number()); 
    while (/*somecondition*/) 
    {/*some stuff*/} 
    //some stuff 
} 

這是一個多線程的申請(我通過強制執行它來使用兩個線程來運行它),我可以確定第一個線程到達printf語句(因爲它是用線程信息輸出的)。現在gdb告訴我,你有以下錯誤

0x0000000000406fc4 in bf_dup_eleminate_read (bf=<error reading variable: Cannot access memory at address 0x7ffff7edba58>, fp=<error reading variable: Cannot access memory at address 0x7ffff7edba50>, j=<error reading variable: Cannot access memory at address 0x7ffff7edba4c>) at bloom-filter.c:536

Line 536int bf_dup_eleminate_read (const bloom_filter *bf, FILE *fp, int j)

的錯誤信息是很清楚,但我沒有得到這爲什麼會發生。我想不出爲什麼會發生這種情況。確定文件已打開(因爲功能bf_dup_eleminate中的錯誤消息未打印)。另外我相信,如果兩個線程正在執行相同的代碼行,那麼它們將爲所有局部變量分別實例化。鑑於可能是什麼問題。

任何幫助表示讚賞!

P.S .: cilk_for關鍵字只是一個構造,用於在運行時產生線程。

程序時由要使用的線程數1

回答

0

好像當你通過引用傳遞變量,我的意思是table_bloom [LINE_COUNT],它傳遞的指針所有線程運行。所以所有線程都試圖同時訪問指針值。您可以嘗試製作每個參數的副本,然後將其傳遞給bf_dup_eleminate_read。 沒有測試代碼:

int bf_dup_eleminate (const bloom_filter *bf, const char *file_name, int j) 
{ 
    bloom_filter *t_bf = bf; 

    int count=-1; 
    FILE *fp = fopen (file_name, "rb"); 
    if (fp) 
    { 
     count = bf_dup_eleminate_read (t_bf, fp, j); 
     fclose (fp); 
    } 
    else 
    { 
     printf ("Could not open file\n"); 
    } 
    return count; 
} 

或這不工作,嘗試使每個參數的硬拷貝:

bloom_filter t_bf = *bf; //forgot how struct copying is done 
    char *t_filename = strdup(filename); 
    int t_j = j; //not required 

如果不能進行復制,那麼也許使用互斥。見link

+0

這可能是有道理的,但你看到錯誤'GDB'給它說的是'文件指針'和'j'具體是 –

+0

它說bf = <讀取變量的錯誤:無法訪問地址0x7ffff7edba58>處的內存,fp = <錯誤讀取變量:無法訪問地址0x7ffff7edba50>處的內存,j = <讀取錯誤變量:無法訪問地址0x7ffff7edba4c處的內存>那好嗎? – ArmenB

+0

我在這裏有點困惑,「那好吧?」。你能否詳細說明 –