我想問的是一些大代碼的一部分,但我會盡量縮短它的大小。我將首先從我的代碼中解釋相關的代碼片段,然後解釋我遇到的錯誤。錯誤訪問多線程程序中的文件指針
從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_read
從bloom-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 536
是int bf_dup_eleminate_read (const bloom_filter *bf, FILE *fp, int j)
的錯誤信息是很清楚,但我沒有得到這爲什麼會發生。我想不出爲什麼會發生這種情況。確定文件已打開(因爲功能bf_dup_eleminate
中的錯誤消息未打印)。另外我相信,如果兩個線程正在執行相同的代碼行,那麼它們將爲所有局部變量分別實例化。鑑於可能是什麼問題。
任何幫助表示讚賞!
P.S .: cilk_for
關鍵字只是一個構造,用於在運行時產生線程。
程序時由要使用的線程數1
這可能是有道理的,但你看到錯誤'GDB'給它說的是'文件指針'和'j'具體是 –
它說bf = <讀取變量的錯誤:無法訪問地址0x7ffff7edba58>處的內存,fp = <錯誤讀取變量:無法訪問地址0x7ffff7edba50>處的內存,j = <讀取錯誤變量:無法訪問地址0x7ffff7edba4c處的內存>那好嗎? – ArmenB
我在這裏有點困惑,「那好吧?」。你能否詳細說明 –