나는 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에 있습니다. 내가 쓰레드를 죽이는 방법이라고 생각하지만, 가능한 가장 단순한 일을하고있다. 사전에
감사합니다 ...
printf 패밀리 중 하나에서 인수의 개수와 형식 문자열 사이에 mimsatch가 있습니까? –
'gdb '는 segfault가 발생하는 곳을 어디에서 말합니까? – caf
@jim - 나는 그렇게 생각하지 않는다.스레드, 메인 프로그램 또는 공유 변수에서 어디에서 보길 원하십니까? – Robert