내가 원하는 것은 큰 코드의 일부이지만 가능한 한 짧게하려고 노력할 것입니다. 우선 코드에서 관련 코드 스 니펫을 먼저 설명하고 내가 얻는 오류를 설명합니다.멀티 스레드 프로그램에서 파일 포인터에 액세스하는 중 오류가 발생했습니다.
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 536
을 int bf_dup_eleminate_read (const bloom_filter *bf, FILE *fp, int j)
오류 메시지는 매우 분명하다하지만 난 왜 일어나는 것을 얻을 didnt가되어 있다고 알려줍니다. 나는 이것이 일어나고있는 이유를 생각할 수 없다. 파일이 열렸습니다 (기능 bf_dup_eleminate
의 오류 메시지가 인쇄되지 않았 음). 또한 두 스레드가 모든 로컬 변수에 대해 별도의 인스턴스화를 사용하는 것보다 동일한 코드 행을 실행하는 경우이를 믿습니다. 주어진 문제가 무엇인지 생각해보십시오.
도움을 주시면 감사하겠습니다.
P.S. .: cilk_for
키워드는 런타임에 스레드를 생성하는 구성 요소입니다. 사용하는 스레드 수는
이것은 의미가 있습니다 만,'GDB'가'file pointer'와'j'에 대해 특별히 말한 오류를 보았습니까 –
bf = <변수 읽기 오류 : 주소 0x7ffff7edba58>에있는 fp = <변수 읽기 오류 : 주소 0x7ffff7edba50의 메모리에 액세스 할 수 없습니다.>, j = <변수 읽기 오류 : 주소 0x7ffff7edba4c의 메모리에 액세스 할 수 없습니다.> 그게 전부입니까? – ArmenB
나는 여기서 "그게 전부다"라고 혼란스러워합니다. –