2012-06-29 5 views
1

내가 원하는 것은 큰 코드의 일부이지만 가능한 한 짧게하려고 노력할 것입니다. 우선 코드에서 관련 코드 스 니펫을 먼저 설명하고 내가 얻는 오류를 설명합니다.멀티 스레드 프로그램에서 파일 포인터에 액세스하는 중 오류가 발생했습니다.

main.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에서 :

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

이는 멀티 스레드 APPL이고 (두 스레드를 사용하도록 강제 실행하여) 첫 번째 스레드가 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)

오류 메시지는 매우 분명하다하지만 난 왜 일어나는 것을 얻을 didnt가되어 있다고 알려줍니다. 나는 이것이 일어나고있는 이유를 생각할 수 없다. 파일이 열렸습니다 (기능 bf_dup_eleminate의 오류 메시지가 인쇄되지 않았 음). 또한 두 스레드가 모든 로컬 변수에 대해 별도의 인스턴스화를 사용하는 것보다 동일한 코드 행을 실행하는 경우이를 믿습니다. 주어진 문제가 무엇인지 생각해보십시오.

도움을 주시면 감사하겠습니다.

P.S. .: cilk_for 키워드는 런타임에 스레드를 생성하는 구성 요소입니다. 사용하는 스레드 수는

답변

0

1., 모든 스레드에 포인터를 전달있어 참조로 변수를 통과 할 때, 나는 [line_count 변수를] table_bloom 의미하는 것 같다 만들어 질 때

프로그램이 실행됩니다. 그래서 모든 스레드가 동시에 포인터 값에 액세스하려고합니다. 각 인수의 복사본을 만든 다음 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'가'file pointer'와'j'에 대해 특별히 말한 오류를 보았습니까 –

+0

bf = <변수 읽기 오류 : 주소 0x7ffff7edba58>에있는 fp = <변수 읽기 오류 : 주소 0x7ffff7edba50의 메모리에 액세스 할 수 없습니다.>, j = <변수 읽기 오류 : 주소 0x7ffff7edba4c의 메모리에 액세스 할 수 없습니다.> 그게 전부입니까? – ArmenB

+0

나는 여기서 "그게 전부다"라고 혼란스러워합니다. –

관련 문제