2010-12-07 6 views
0

나는 pthreads를 사용하는 프로젝트를 가지고있다; 메인 스레드와 서브 스레드와 파이프가 있습니다. 모두 정상적으로 작동하지만 가끔이 작동하지 않습니다. 하위 스레드는 명령 인터프리터를 실행하고 ncurses 기반 GUI는 파이프를 통해 입력을 셔틀 (일부)합니다. 인터프리터 스레드가 사용자로부터의 "종료"명령을 수신하면pthread_exit (NULL) segfaults

제가 일반적 스레드를 생성

if (pthread_create(&thread, NULL, interp_start, NULL)) { perror("couldn't create thread"); return; } 

이어서 (스레드가가 pthread_t 파일 범위의 변수이고, interp_start 함수 임), 그것은 interp_exit 호출

:

fclose(output); 
pthread_exit(NULL); 

메인 스레드는 다른 것들의 출력 FD 중에서 조사하고 FD로부터 판독 함수()를 호출하는 S) (a 선택을 갖는다

종종 작동하는 의도 된 동작은 select() 보고서를 준비 상태로 만드는 FILE *을 닫는 것입니다. 그러면 read()가 발생하여 shell_done()을 호출하는 0을 반환합니다. 이것은 몇 가지 간단한과 관련이없는 정리 한 후, 수행합니다

//fprintf(stderr, "joining thread\n"); 
pthread_join(thread, NULL); 
//fprintf(stderr, "joined\n"); 
exit(EXIT_SUCCESS); 

때때로 세그먼테이션 폴트 (segfault)의 모든합니다. 보통 괜찮습니다. 이 두 printfs의 주석을 풀면, 실패해도 pthread_exit에서 segfaults를 얻거나 아니면 첫 번째 (pthread_join에서 segfaults)를 얻지 못한다.

나는 다른 지점에서 '스레드'를 망치고 있지 않으며, 널 포인터 만 처리합니다. 거래는 뭐니? 그 두 줄 중 하나에서 문제가 계속 발생하는 것을 제외하고는 다른 곳을보고있을 것입니다. 한 번은 restore_sem_to_pool에 있습니다. 내가 쓰레드를 죽이는 방법이라고 생각하지만, 가능한 가장 단순한 일을하고있다. 사전에

감사합니다 ...

+0

printf 패밀리 중 하나에서 인수의 개수와 형식 문자열 사이에 mimsatch가 있습니까? –

+0

'gdb '는 segfault가 발생하는 곳을 어디에서 말합니까? – caf

+0

@jim - 나는 그렇게 생각하지 않는다.스레드, 메인 프로그램 또는 공유 변수에서 어디에서 보길 원하십니까? – Robert

답변

0

나는이 모든 것을 조합 한 것으로 의심되지만 문제는 사라졌습니다. 프로그램이 시작된 후에 너무 빨리 'quit'을 입력했을 때만 발생했습니다. 그러나 지금은 제대로 디버그 할 시간이 없기 때문에 할당은 이미 예정되어 있습니다. @ 존 - 사실이 목적을 위해 valgrind를 설정하고있었습니다. [편집] 이전에 실행했는데이 문제로 인해 도움이되지 않았지만 해제하지 않은 메모리를 찾았습니다. 다른 사람들 - 내 생각 엔 네가 옳다고 생각한다. 일종의 메모리 손상. @caf - 다른 스레드를 확인하는 것을 잊어 버렸습니다 ...하지만 두 스레드 모두에서 문제가 발생했습니다. GDB는 실제로 segfaulting이었던 것을 가리키고있었습니다. [편집] 나는 다른 스레드를 확인하고 바로 pt_exit 전에 어딘가합니다 (segfault의이 pt_exit로 된 경우) 또는 [/ 편집]

합니다 (segfault의이 pt_join의 경우)이 중 하나 pt_join에 기다리고 있었다

모두에게 투표했지만 여기에 답변을 수락하는 것이 공평하지 않다고 생각합니다.

6

시도 valgrind (특히 "memcheck"부분)를 사용. 런타임시 유효하지 않은 메모리 액세스를 정확히 찾아내는 데 도움이되며 때로는 충돌하지 않는 프로그램 실행도 포함됩니다.