잘되던 루틴이 pthread로 돌리면 segmentation fault가 뜨네요..
글쓴이: lobin2 / 작성시간: 토, 2007/06/16 - 9:21오후
libmad를 사용해서 mp3 플레이어를 제작하고 있습니다.
libmad의 샘플코드를 조금 수정해서 일단 mp3 출력은 제대로 되는데요...
XWindow상에서 pthread를 생성해서 mp3를 재생하려고 thread로 mp3 출력 부분을 돌렸습니다.
그런데 펑션 콜로하면 제대로 플레이되던 함수가 쓰레드를 쓰니.. 잠깐소리가 나왔다가
바로 segmentation fault로 떨어지네요...
혹시 이런 경험 가지고 계신 분 안계신가요?
Forums:
해결 했습니다. ^^;
정확한 원인은 모르겠는데... 기존에 쓰레드 속성을 PTHREAD_CREATE_DETACHED 를 줬는데.. 위와같이 에러가 나더군요.
쓰레드 속성을 NULL로 주니.. 이상없이 잘 실행되네요..
혹시 원인 아시는 분 계시나요?
혹시
혹시 PTHREAD_CREATE_DETACHED 를 주고 빌드한 다음,
export LD_ASSUME_KERNEL=2.4.1
하고 나서 실행하면 어떻게 되나요?
일반적으로 PTHREAD_CREATE_DETACHED는
일반적으로 PTHREAD_CREATE_DETACHED는, 생성되는 thread의 진입 함수의 끝에 도달하면, 스택 메모리 등과 같이 thread에 할당된 자원이 자동으로 해지되는 option입니다. 이에 비해 기본 option인 PTHREAD_CREATE_JOINABLE는, pthread_join() 함수가 호출되기 전까지는 thread의 자원이 해제되지 않고 유지됩니다. 따라서 누군가(다른 thread)가 pthread_join() 함수를 호출해 줘야 합니다. (이때, pthread_join() 함수를 호출한 thread는, 생성된 thread가 종료되어 자원이 해제될 때까지 block됩니다.)
말씀하신 상황은,
1. FncA()에서 FncB() 호출 -> OK
2. FncA()에서 PTHREAD_CREATE_DETACHED 옵션으로 FncB()를 진입함수로 하는 thread 생성 -> seg. fault
3. FncA()에서 기본 옵션(PTHREAD_CREATE_JOINABLE)으로 FncB()를 진입함수로 하는 thread 생성 -> OK
1, 3 번에서 문제가 없고, 2번에서만 문제가 발생하는 것으로 봐서, FncA()에서 FncB()를 호출한 다음, FncB()에서 관리하는 어떤 리소스를 사용하는 것 같습니다.
일반적으로 FncA() 와 FncB()가 별도의 thread로 분리되어야 하는데, FncB()가 완료될 때까지 기다려야 하는 것이면 FncB()를 PTHREAD_CREATE_JOINABLE 옵션으로 thread로 생성한 다음, pthread_join()을 호출해 주면 되고, 주어야만 합니다. 아니면 FncB() thread에서 리소스가 해지되지 않습니다.
이에 비해 PTHREAD_CREATE_DETACHED 옵션은 FncB()가 완전히 독립적으로 실행되고, FncA()는 해당 FncB()를 thread로 생성한 다음 다른 작업을 바로 수행해야 할 때 사용합니다. (만약 어떤 이유로 PTHREAD_CREATE_DETACHED 옵션으로 생성할 thread와 FncA()의 thread가 뭔가 동기화 해야 한다면, mutex, semaphore, condition variable 등의 동기화 개체를 사용하셔야 합니다.)
댓글 달기