私が聞きたいのは大きなコードの一部ですが、できるだけ短くしようと思います。最初にコードから関連するコード スニペットを説明し、次にエラーについて説明します。
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
}
これはマルチスレッド アプリケーションであり (2 つのスレッドを使用するように強制して実行しました)、最初のスレッドが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
されなかったため)。また、2 つのスレッドが同じコード行を実行している場合、すべてのローカル変数に対して個別のインスタンス化が行われると考えています。何が問題になる可能性があるかを考えると。
どんな助けでも大歓迎です!!
PS:cilk_for
キーワードは、実行時にスレッドを生成するための単なる構成要素です。
使用するスレッド数を 1 にするとプログラムが実行されます。