[완료]리눅스 초짜입니다 pthread 관련해서 질문 좀 드릴께요 ㅜ

1lee123의 이미지

제가 사수로부터 분석을 지시 받은 코드를 가지고 별도의 테스트코드를 작성 중에 있습니다

분석 중인 코드에서 main을 보면

while(1)
{
pthread_create(&threadID..);
pthread_detach(threadID);
sleep(2);
}

이렇게 되어 있습니다

도대체 저 코드가 이해가 안가네요;;;

제가 알기로는 pthread_create 후에 pthread_join이 호출되는것이 당연하다고 생각했는데;;;

위의 코드가 무슨 의미일까요? ㅜㅜ

그리고 저렇게 되면 pthread_create인자중 함수포인터가 넘어가는데 해당 함수가 정상 동작 후 종료가 되는걸까요???

oosap의 이미지

https://computing.llnl.gov/tutorials/pthreads/#Joining

Detaching:
The pthread_detach() routine can be used to explicitly detach a thread even though it was created as joinable.
There is no converse routine.

http://linux.die.net/man/3/pthread_detach

리눅스 기반에서의 쓰레드를 종료하는 데에는 pthread_join() 이나 pthread_detach() 중 어느 하나는 반드시 호출해야 한다.(물론 쓰레드를 생성할 때 detached 로 생성하는 경우는 예외가 될 것 같다. 이미 detached 이므로..)

정리를 깔끔하게 하지는 못했습니다. 저두 잘 아는 것이 아니라서요..

//////////////////////////////////////////////////////////////////////////////
>> 위의 코드가 무슨 의미일까요? ㅜㅜ
쓰레드 하나를 만들고 그 쓰레드를 분리를 시킨 것이네요. 쓰레드를 분리한다는 것의 의미는 해당 쓰레드의 리턴값 혹은 pthred_exit() 의 인자값을 아무도 확인하지 않아도 되도록 한다는 것 같아요. 자신은 없네요....

>> 그리고 저렇게 되면 pthread_create인자중 함수포인터가 넘어가는데 해당 함수가 정상 동작 후 종료가 되는걸까요???
네 그렇죠. 그리고 분리가 된 쓰레드 이므로 아무도 그 쓰레드의 종료값(리턴값 혹은 pthread_exit() 인자값)을 확인하려하지 않죠. 마치 홀로 생을 마감한 노숙자에 아무도 관심 없는 것 처럼... 쓸쓸하군요..
//////////////////////////////////////////////////////////////////////////////

표시한 부분은 부정확한 정보임을 밝힙니다.

Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.

1lee123의 이미지

저 정도 댓글 달아주신것만 해도 큰 도움이 되었습니다
감사합니다^^

그런데 만약 pthread_detach 호출로 부모스레드(?)가 pthread_create로 생성된 자식스레드(?)를 신경 안쓴다는 의미로 본다면 sleep이 코드가 없어도 자식스레드에 등록된 함수도 정상동작 후 종료되야되는것이 아닌가요?? ㅜ

그런데 위의 코드에서 sleep이 없으면 pthread_create의 인자에 등록되는 함수가 아예 호출이 안되고 그냥 종료되는듯 싶습니다

저런식으로 하려면 sleep을 반드시 넣어줘야 하는건가요?? ㅜ

1lee123의 이미지

제가 원래 테스트한 코드는
int i = 0;
while(i < 3)
{
i++;
pthread_create(&threadID..);
pthread_detach(threadID);
}
이거였습니다

그랬더니 pthread_create함수의 인자로 넘겨주는 함수가 모든 부분을 수행하지 못하고 종료되는데 그 이유가 스레드가 모든 부분을 수행하기 전에 main 자체가 종료가 되서 일어난 일이더군요
pthread_detach 대신 pthread_join을 하면 스레드가 끝날때까지 블러킹이 되서 상관이 없었는데 제가 헷갈렸네요
답변 감사드려요^^

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.