스레드 사용법 익히기

hyenam·2021년 10월 5일

Philosophers

목록 보기
4/7

일단 이번 과제를 해결하기 위해서는 스레드와 뮤텍스라는 것을 다룰줄 알아야한다. 하지만 나는 스레드를 다뤄본적이 없기때문에 스레드 다루는 법부터 공부를 해야한다.

pthread_create

해당함수를 이용하여 스레드를 생성을 할 수 가 있다.

프로토타입
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(start_routine)(void ), void *arg);

  • 첫번째 매개변수인 thread 는 쓰레드가 성공적으로 생성되었을때 생성된 쓰레드를 식별하기 위해서 사용되는 쓰레드 식별자이다.
  • 두번째 매개변수인 attr 은 쓰레드 특성을 지정하기 위해서 사용하며, 기본 쓰레드 특성을 이용하고자 할경우에 NULL 을 사용한다.
  • 세번째 매개변수인 start_routine는 분기시켜서 실행할 쓰레드 함수이며,
  • 네번째 매개변수인 arg는 위 start_routine 쓰레드 함수의 매개변수로 넘겨집니다.
  • 성공적으로 생성될경우 0을 리턴한다.

pthread_join

특정 쓰레드가 종료하기를 기다렸다가, 쓰레그가 종료된 이후 다음 진행

프로토타입
int pthread_join(pthread_t th, void **thread_return);

  • 첫번째 매개변수 th 는 기다릴 쓰레드의 식별자.
  • 두번째 매개변수 thread_return 은 쓰레드의 리턴값. hread_return 이 NULL이 아닌 경우 해당 포인터로 쓰레드의 리턴 값을 받아올수 있습니다.
  • 리턴값: 성공하면 0, 실패하면 에러코드 리턴

join된 쓰레드 (종료된 쓰레드)는 모든 자원을 반납하게 됩니다.

pthread_detach

특정 쓰레드를 분리시키는 함수

'일반적'으로 쓰레드를 pthread_create() 를 사용하여 생성하면, 쓰레드가 종료되더라도 사용했던 모든 자원이 해제되지 않습니다.

반면 pthread_join() 을 사용하면 종료될때까지 기다렸다가 종료시점이 되면, 자원이 반납됩니다.

pthread_detach() 함수는 pthread_join()을 사용하지 않더라도, 쓰레드 종료될때 모든 자원을 해제 됩니다.

프로토타입
int pthread_detach(pthread_t th);

  • 첫번째 매개변수 th는 분리시킬 쓰레드 식별자.
  • 리턴값: 성공하면 0, 실패하면 에러코드 리턴

pthread_join과 pthread_detach 차이점

두 함수 모두 스레드가 종료하면 사용된 자원에 대해서 즉시 free를 한다

다만, join은 두 번째 인자인 void **형태의 반환값을 받아와서 또 다른 제어를 할 수 있다. 하지만 detach는 그런 것 없이 바로 할당된 메모리를 해제한다

그리고 join은 blocking, detach는 non-blocking 함수로, 프로세스인 메인 스레드에서 join의 사용은 뒷 코드의 내용이 바로 실행되지 않는다는 특징이 있다

blocking과 non blocking

동기 비동기와 비슷한 개념
blocking과 non-blocking은 주로 IO의 읽기, 쓰기에서 사용된다.

blocking

  • 요청한 작업을 마칠 때까지 계속 대기한다.
  • 즉시 return한다.
  • return 값을 받아야 끝난다.
  • Thread 관점으로 본다면, 요청한 작업을 마칠 때까지 계속 대기하며 return 값을 받을 때까지 한 Thread를 계속 사용/대기 한다.

non-blocking

  • 요청한 작업을 즉시 마칠 수 없다면 즉시 return한다.
  • 즉시 리턴하지 않는다. (일을 못하게 막는다.)
  • Thread 관점으로 본다면, 하나의 Thread가 여러 개의 IO를 처리 가능하다.

여기까지가 이번과제에서 사용가능한 함수들
아래부터는 그냥 추가적으로 공부한 함수들


pthread_exit

현재 실행중인 thread를 종료시킬때 사용

보통 pthread_exit가 호출되면 cleanup handler가 호출되며 보통 리소스 해제하는 일을 수행한다.

프로토타입
void pthread_exit( void* ret_value );

  • 매개변수 retval은 pthread_join() 에서 받아 쓸수 있다

pthreadcleanup

만약, 쓰레드에서 어떠한 자원을 사용하는게 있었다면 종료하기 전에 반납해야 하는등의 처리를 해야 합니다.

이와 같은 동작을 cleanup handler 함수를 등록하여 수행하게 할수 있습니다.

바로 pthred_cleanup_push() 함수와 pthred_cleanup_pop() 함수 입니다

pthread_cleanup_push

pthread_exit()가 호출될 때 호출된 handler를 정하는 함수
claenup handler 함수는 자원을 반납하거나, mutex 등의 잠금 해제등을 위한 용도로 사용

프로토타입
void pthrad_cleanup_push(void (*routine) (void *), void* arg);

  • 매개변수 routine: pthread_exit() 함수가 호출되어 쓰레드가 종료될때 routine 함수를 호출합니다
  • 매개변수 arg: routine 함수에 넘겨지는 매개변수

pthread_cleanup_pop

설정된 cleanup handler를 제거하기 위해서 사용되는 함수

프로토타입
void pthread_cleanup_pop(int exec);

  • 매개변수 execute 가 0 이라면, pthread_cleanup_push 에 의해 인스톨된 cleanup handler 를 (실행시키지 않고)삭제만 시킵니다.
  • 0 이 아닌 숫자라면 cleanup handler 을 실행시키고 삭제 된다.

그리고 pthread_cleanup_push 와 pthread_cleanup_pop 은 반드시 같은 함수내의 같은 레벨의 블럭에서 한쌍으로 사용해야 합니다

pthread_self

현재 동작중인 pthread의 식별자를 리턴한다.

프로토타입
pthread_t pthread_self(void);

pthread_attr

쓰레드를 분리시키는 방법으로, pthread_detach() 함수대신 '쓰레드 속성' 값을 주어 애초에 생성될때 detach 속성으로 생성되게 할수 있습니다.

이를 위해서는 쓰레드 속성 ( pthread_attr_t ) 과 이를 다루는 다음의 함수들을 사용해야 합니다

pthread_attr_setdetachstate

쓰레드의 상태를 PTHREAD_CREATE_JOINABLE 혹은 PTHREAD_CREATE_DETACHED 상태로 변경

프로토타입
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);

pthread_attr_t attr;

// JOINABLE 상태로 변경
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

// DETACHED 상태로 변경
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

리턴값: 성공하면 0.

이거 사용하면 pthread_detach나 pthread_join 안써도됨 대신

pthread_create(&p_thread, &attr, t_function, (void *)&a);

이런식으로 두번째에 매개변수로 넣어줘야함

pthread_attr_init

프로토타입
int pthread_attr_init(pthread_attr_t *attr);

pthread_attr_init는 쓰레드 속성 객체인 attr을 초기화.

리턴값: 성공할경우 0을 돌려주고 실패할경우 -1

pthread_attr_destroy

프로토타입
int pthread_attr_destroy(pthread_attr_t *attr);

pthread_attr_init에 의해 생성된 thread attribute 객체인 attr을 제거

제거된 attr 을 다시 사용하기 위해서는 pthread_attr_init를 이용해서 다시 초기화 해주어야 한다.

리턴값: 성공하면 0


학습에 참고한 사이트

profile
공부한 걸 정리하고 있습니다.

0개의 댓글