[완료] thread의 메인 쓰레드와 서브 쓰레드의 관계에 의문이 생겼습니다.

sia79의 이미지

문제의 예제 코드입니다.

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
 
void *do_loop( void *data )
{
  int i;
 
  int me = *( ( int *) data );
  for( i = 0; i < 5; ++i ) {
    printf("%d - Got %d\n", me, i );
    sleep(1);
  }
}
 
int main( void )
{
  int thr_id;
  pthread_t p_thread[3];
  int status;
  int x = 0;
  int a = 1;
  int b = 2;
  int c = 3;
 
  thr_id = pthread_create(&p_thread[0], NULL, do_loop, (void *)&a);
 
  for( x = 0; x < 10; ++x ) {
    printf(" main - Got %d \n", x );
    sleep(1);
  }
 
  thr_id = pthread_create(&p_thread[1], NULL, do_loop, (void *)&b);
  thr_id = pthread_create(&p_thread[2], NULL, do_loop, (void *)&c);
 
//  pthread_join( p_thread[0], (void **) &status );
//  pthread_join( p_thread[1], (void **) &status );
//  pthread_join( p_thread[2], (void **) &status );
 
  printf("... programing is end ... \n");
  return 0;
}

주석처리 해준 부분을 제거하면 정상으로 처리가 됩니다만...
조인을 해주지 않아도 정상적으로 처리 될 줄 알았는데...
2번, 3번 쓰레드가 실행되어지지 않고 있습니다.
특별한 이유라도 있나요?
쓰레드는 생성할 때 한꺼번에 사용할 만큼 생성해야만 한다... 라던가;;;
(C로 예를 들으면 사용할 변수는 꼭 함수 앞부분에 선언하고 써라... 처럼 말이죠.)
지금 인터넷 여기저기서 문서를 찾아서 막무간으로 예제 코딩 하면서 공부하려고 하는데...
쓰레드에 대해 체계적으로 정리된 책은 없을까요? C문법책처럼... 있다면 추천 부탁드립니다.
아, 되도록 한글 책으로 부탁합니당;

parkys1의 이미지

O/S에서 쓰레드에 관한 기본은 Operating System Concepts 를 보시면 기본적인 내용이 나와있습니다.
흔히 공룡책이라고 부르죠...

하지만 리눅스에서는 posix쓰레드를 지원하지 않고 약간의 편법을 이용해서 사용한다고 알고 있습니다.
즉, thread만을 만드는 것이 아니고, PCB를 fork()한것같이 만들어 process group에 넣어버린다는...
linux 2.6초반때까지는 이방법을 썼으나 지금은 posix thread를 지원한다는 소리가 있는데 한번 확인해 보시기 바랍니다.

우선 개념은 공룡책으로 잡고, 사용방법은 역시 Advanced Programming in the Unix Environment 2nd edition을 보시면
자세히 나와있습니다. 이 책은 스티븐스(Richard Stevens) 책이라고 많이 알려져있죠...

위 두 책을 우선 보시고 kernel에서 어떻게 동작하시는지 알고 싶으시면 또 유명한 책인 Understanding the Linux Kernel책을 보시면
어느정도 이해하실 수 있으실거라고 생각합니다.

그럼 차례대로 천천히 읽어보시기 바랍니다. 너무 조급하게 마음먹으로 오히려 기초가 쌓이지 않을수도 있으니 천천히 정독하시는게 좋을거 같네요

sia79의 이미지

영문 책같은 느낌이 강하게 드는군요. ^^;;
PCB, process group 이라는 말이 생소한 것을 보니 한참 기초가 부족한가 봅니다.
집에 돌아가는 길에 권해주신 책을 살펴보겠습니다.
말씀 고맙습니다~.

jick의 이미지

main 함수에서 리턴하면 exit 함수를 부르는 것과 동일한 효과가 있습니다. 바로 프로그램이 종료되어 버립니다.

그 순간 쓰레드가 뭐가 돌고 있든지 상관하지 않고 다 종료해 버립니다. (쓰레드는 프로세스의 하위개념이니까...)

따라서 join을 하지 않으면 그 쓰레드가 끝날 때까지 기다린다는 게 전혀 보장이 되지 않습니다. 같은 컴퓨터에서 돌려도 경우에 따라서 다 돌 수도 있고 하나만 돌 수도 있고 아예 시작도 못했을 수도 있습니다. OS 기분 내키는 대로입니다.

sia79의 이미지

오오. 빠른 답변 감사합니다.

익명 사용자의 이미지

우선 posix대한 한글판 책입니다. ^^;

http://www.yes24.com/Goods/FTGoodsView.aspx?goodsNo=376332&CategoryNumber=001001003016001006

pthread_join( p_thread[0], (void **) &status );
사용하셨을때는 main()이 이 함수에서 대기하다가 쓰레드 종료후 결과값을 반환하고 main()이 진행되겠죠..

만약 사용 안 하셨을때는???
당근 main()은 쓰레드가 돌아가던 말던 종료될터이고, 종료되면서 종속된 thread도 종료시키겠죠.

2번, 3번 쓰레드가 실행되어지지 않고 있습니다.
특별한 이유라도 있나요?

즉 특별한 이유가 아니라, main()이 종료된 겁니다. 쓰레드에 대한 책을 권합니다.

sia79의 이미지

그렇군요. 쓰레드가 돌아가기도 전에 메인 쓰레드의 리턴에 의해 프로그램이 종료된 것이군요.

설명 감사합니다. 책은 돌아가는 길에 사 보겠습니다. 고맙습니다.

fedorasix의 이미지

답변 감사합니다. 책 구입하려고 보니 yes24와 강컴은 절판입니다 ㅠ.

댓글 달기

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