pthread - 해당되는 글 2건

스레드는 스택공간을 할당해준다.
쓰레드 관련 정보가 들어갈 공간
사이즈정보
쓰레스 스택의 시작주소 쓰레드의 시작 포인트 쓰레드 속성들
쓰레드가 스케줄링하는것도 프로세스에 비하면 오버해드가 적다
피시값의 변화만 해서 쓰레드를 바꾼다.

피쓰레드라는것은 라이브러리가 따로 존재한다.
소프트웨어적으로 쓰레드 구현
 
2.1. pthread_create 이것만 알면 우선은 쓰레드를 생성해서 돌릴수 있다.
스레드로 생성되는 함수는 무한루프로 돌린다.
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                   void *(*start_routine)(void *)함수로 넘김, void *arg함수로 넣어줄 인자값);

2.2 #include <pthread.h>
int pthread_join(pthread_t th, void **thread_return); 해당 쓰레드가 끝날때까지 기다리는 함수
                                                                                                                               void **thread_return:  리턴값을 반환 받기 위해서 쓰는것
첫번째 아규먼트 th는 기다릴(join)할 쓰레드 식별자이며, 두번째 아규먼트 thread_return은 쓰레드의 리턴(return) 값이다. thread_return 이 NULL 이 아닐경우 해다 포인터로 쓰레드 리턴 값을 받아올수 있다.

2.3. pthread_detach
피스레드를 기본적으로 생성을 하면생성된 쓰레드와 연결이 된다는것이다.

조인을 호출을 안해주면 반환이 안되고 해당정보에대한것들이 메모리에 그대로 남아있게 된다.
***디테치를 선언하면 조인을 하지 않아도 메모리에 관한 정보가 그대로 남아 있게 된다.***

2.4. pthread_exit 자기 자신만 종료하는 스레드
void pthread_exit(void *retval);
 pthread_exit 는 현재 실행중인 쓰레드를 종료시키고자 할때 사용한다. 만약 pthread_cleanup_push 가 정의되어 있다면, pthread_exit 가 호출될경우 cleanup handler 가 호출된다. 보통 이 cleanup handler 은 메모리를 정리하는 등의 일을 하게 된다.


2.5 void pthrad_cleanup_push(void (*routine) (void *), void *arg);
자원반환 엠얼록으로 할당한 자원의 자원 반한 뮤텍스 제거역할등을 수행을한다.

2.6. pthread_cleanup_pop
pthread_cleanup_push 와 함께 사용되며, install 된 cleanup handler 을 제거하기 위해서 사용된다. void pthread_cleanup_pop(int execute);
만약 execute 가 0 이라면, pthread_cleanup_push 에 의해 인스톨된 cleanup handler 를 (실행시키지 않고)삭제만 시킨다. 0 이 아닌 숫자라면 cleanup handler 을 실행시키고 삭제 된다. 사용예제는 2.5절을 참고하라.
그리고 pthread_cleanup_push 와 pthread_cleanup_pop 은 반드시 같은 함수내의 같은 레벨의 블럭에서 한쌍으로 사용해야 한다.

2.7. pthread_self 현재 쓰레드의 쓰레드 아이디를 알수 있다
pthread_t pthread_self(void);
 pthread_self를 호출하는 현재 쓰래드의 쓰레드식별자를 되돌려준다.



      c 언어  |  2007. 9. 19. 10:49




#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

// 쓰레드 함수
void *
t_function(void *data)
{
    int id;
    int i = 0;
    id = *((int *)data);

   
while(1)
    {
        printf("%d : %d\n", id, i);
        i++;
       
sleep(1);
    }
}

int
main()
{
    pthread_t p_thread[2];
    int thr_id;
    int status;
    int a = 1;
    int b = 2;

    // 쓰레드 생성 아규먼트로 1 을 넘긴다. 
    thr_id = pthread_create(&p_thread[0], NULL, t_function, (void *)&a);//선언한 변수의 주소값,옵션,스레드 함수값, 함수에게 전달할 전달인자
    if (thr_id < 0)
    {
       
perror("thread create error : ");
       
exit(0);
    }

    // 쓰레드 생성 아규먼트로 2 를 넘긴다.
    thr_id = pthread_create(&p_thread[1], NULL, t_function, (void *)&b);
    if (thr_id < 0)
    {
       
perror("thread create error : ");
       
exit(0);
    }

    // 쓰레드 종료를 기다린다.
    pthread_join(p_thread[0], (void **)&status);
    pthread_join(p_thread[1], (void **)&status);

    return 0;
}





      c 언어  |  2007. 9. 19. 10:02



sokoban's Blog is powered by Daum & Tattertools