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_eleminatebloom-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
}

これはマルチスレッド アプリケーションであり (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 536int bf_dup_eleminate_read ( const bloom_filter *bf, FILE *fp, int j )

エラーメッセージはかなり明確ですが、なぜそれが起こっているのかわかりません。これが起こっている理由は考えられません。ファイルが開かれたことは確かです (関数内のエラー メッセージが出力bf_dup_eleminateされなかったため)。また、2 つのスレッドが同じコード行を実行している場合、すべてのローカル変数に対して個別のインスタンス化が行われると考えています。何が問題になる可能性があるかを考えると。

どんな助けでも大歓迎です!!

PS:cilk_forキーワードは、実行時にスレッドを生成するための単なる構成要素です。

使用するスレッド数を 1 にするとプログラムが実行されます。

4

1 に答える 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

コピーを作成できない場合は、ミューテックスを使用してください。リンクを参照してください。

于 2012-06-29T18:14:30.220 に答える