잘되던 루틴이 pthread로 돌리면 segmentation fault가 뜨네요..

lobin2의 이미지

libmad를 사용해서 mp3 플레이어를 제작하고 있습니다.

libmad의 샘플코드를 조금 수정해서 일단 mp3 출력은 제대로 되는데요...
XWindow상에서 pthread를 생성해서 mp3를 재생하려고 thread로 mp3 출력 부분을 돌렸습니다.

그런데 펑션 콜로하면 제대로 플레이되던 함수가 쓰레드를 쓰니.. 잠깐소리가 나왔다가
바로 segmentation fault로 떨어지네요...

혹시 이런 경험 가지고 계신 분 안계신가요?

lobin2의 이미지

정확한 원인은 모르겠는데... 기존에 쓰레드 속성을 PTHREAD_CREATE_DETACHED 를 줬는데.. 위와같이 에러가 나더군요.
쓰레드 속성을 NULL로 주니.. 이상없이 잘 실행되네요..

혹시 원인 아시는 분 계시나요?

cmoh1110의 이미지

혹시 PTHREAD_CREATE_DETACHED 를 주고 빌드한 다음,
export LD_ASSUME_KERNEL=2.4.1
하고 나서 실행하면 어떻게 되나요?

philnet의 이미지

일반적으로 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 등의 동기화 개체를 사용하셔야 합니다.)

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.