프로그래밍

Posix Thread Example

지니아부지 2012. 8. 10. 15:27

출처 : http://chirow.springnote.com/pages/1650700

1. Posix Thread Example

2. pthread 예제1 : 쓰레드 생성후 자동 종료

#include <stdio.h>
#include <string.h>
#include <pthread.h>

pthread_t threads[5];
int done[5];

void *thread_main(void *);
         
int main(void)
{
 int i;
 int rc;
 int status;

 printf("pid=%d\n", getpid());

 for (i = 0; i < 5; i++)
 {
  done[i] = 0;
  pthread_create(&threads[i], NULL, &thread_main, (void *)i);
  printf("%d, %d\n", i, threads[i]);
 }

 for (i = 4; i >= 0; i--)
 {
  done[i] = 1;
  rc = pthread_join(threads[i], (void **)&status);
  if (rc == 0)
  {
   printf("Completed join with thread %d status= %d\n",i, status);
  }
  else
  {
   printf("ERROR; return code from pthread_join() is %d, thread %d\n", rc, i);
   return -1;
  }
 }

 return 0;
 
}
         
void *thread_main(void *arg)
{
 int i;
 double result=0.0;

 printf("therad: %d, %d\n", (int)arg, getpid());

 while (!done[(int)arg])
 {
  for (i=0; i < 1000000; i++)
  {
   result = result + (double)random();
  }
  printf("thread: %d, result = %e\n", (int)arg, result);
 }

 pthread_exit((void *) 0);
}

3 pthread 예제2 : 쓰레드 생성후 강제로 종료

 #include <stdio.h>
#include <string.h>
#include <pthread.h>

pthread_t threads[5];
int done[5];

void *thread_main(void *);
  
int main(void)
{
  int i;
  int rc;
  int status;

  printf("pid=%d\n", getpid());

  for (i = 0; i < 5; i++)
  {
    done[i] = 0;
    pthread_create(&threads[i], NULL, &thread_main, (void *)i);
    printf("%d, %d\n", i, threads[i]);
  }

  for (i = 4; i >= 0; i--)
  {
    rc = pthread_cancel(threads[i]); // 강제종료
    if (rc == 0)
    {
      // 자동종료
      rc = pthread_join(threads[i], (void **)&status);
      if (rc == 0)
      {
        printf("Completed join with thread %d status= %d\n",i, status);
      }
      else
      {
        printf("ERROR; return code from pthread_join() is %d, thread %d\n", rc, i);
        return -1;
      }
    }
  }

  return 0;
}

  
void *thread_main(void *arg)
{
  int i;
  double result=0.0;

  printf("therad: %d, %d\n", (int)arg, getpid());

  while (!done[(int)arg])
  {
    for (i=0; i < 1000000; i++)
    {
    result = result + (double)random();
    }
    printf("thread: %d, result = %e\n", (int)arg, result);
  }

  pthread_exit((void *) 0);
}

4. pthread 예제3 : 쓰레드 생성후 쓰레드 분리 시키는 첫번째 예제

 #include <stdio.h>
#include <string.h>
#include <pthread.h>

pthread_t threads[5];
int done[5];

void *thread_main(void *);

int main(void)
{
  int i;
  int rc;
  int status;

  printf("pid=%d\n", getpid());

  for (i = 0; i < 5; i++)
  {
    done[i] = 0;
    pthread_create(&threads[i], NULL, &thread_main, (void *)i);
    printf("%d, %d\n", i, threads[i]);
  }

  for (i = 4; i >= 0; i--)
  {
    done[i] = 1;
    rc = pthread_join(threads[i], (void **)&status); /* detach thead에서는 사용할 필요 없다. */
    if (rc == 0)
    {
      printf("Completed join with thread %d status= %d\n",i, status);
    }
    else
    {
      printf("ERROR; return code from pthread_join() is %d, thread %d\n", rc, i);
      return -1;
    }
  }

  return 0;
}

void *thread_main(void *arg)
{
  int i;
  double result=0.0;

  pthread_detach(pthread_self()); /* 쓰레드 분리 */

  printf("therad: %d, %d\n", (int)arg, getpid());

  while (!done[(int)arg])
  {
    for (i=0; i < 1000000; i++)
    {
      result = result + (double)random();
    }
    printf("thread: %d, result = %e\n", (int)arg, result);
  }

  pthread_exit((void *) 0);
}

--> 결과를 보면 에러가 발생하는 것을 볼 수 있다.
참조사이트의 Thread Management > Joining Threads를 보면
It is impossible to join a detached thread (discussed next) 이라고 나온다.

즉, detached thread된 것은 join이 불가능하므로 pthread_join함수를 사용할 필요가 없다.
참고로 pthread_joinc은 waitpid와 비교될 수 있다.

5. pthread 예제4 : 쓰레드 생성후 쓰레드를 분리시키는 두번째 예제 

위 예제에서 pthread_joinc에 관련된 코드를 삭제하였습니다.

 
     #include <stdio.h>
          #include <string.h>
          #include <pthread.h>
          
          pthread_t threads[5];
          int done[5];
          
          void *thread_main(void *);
          
          int main(void)
          {
                  int i;
                  int rc;
                  int status;
          
                  printf("pid=%d\n", getpid());
          
                  for (i = 0; i < 5; i++)
                  {
                          done[i] = 0;
                          pthread_create(&threads[i], NULL, &thread_main, (void *)i);
                          printf("%d, %d\n", i, threads[i]);
                  }
          
                  for (i = 4; i >= 0; i--)
                  {
                          done[i] = 1;
                  }
          
                  /* 쓰레드들이 실행하고 종료할 때 까지 잠시 기다린다.
                     sleep을 주지 않으면 메인이 종료되므로 자동으로 생성된 쓰레드도 강제종료되므로
                     올바른 테스트 진행되지 않아서 이다. */
                  sleep(5);
          
                  return 0;
          }
          
          void *thread_main(void *arg)
          {
                  int i;
                  double result=0.0;
          
                  pthread_detach(pthread_self());
          
                  printf("therad: %d, %d\n", (int)arg, getpid());
          
                  while (!done[(int)arg])
                  {
                          for (i=0; i < 1000000; i++)
                          {
                                  result = result + (double)random();
                          }
                          printf("thread: %d, result = %e\n", (int)arg, result);
                  }
          
                  printf("thread %d terminated....\n", (int)arg);
                  pthread_exit((void *) 0);
          }
          

 

'프로그래밍' 카테고리의 다른 글

[C] 정적함수  (0) 2013.01.29
테라텀(Tera Term) 로그에 타임스탬프 출력 및 로그파일 이름 변경  (0) 2013.01.21
CallBack func  (0) 2012.07.24
pthread_create 다중인자 전달  (0) 2012.07.16
Main  (0) 2012.05.02