일단 이번 과제를 해결하기 위해서는 스레드와 뮤텍스라는 것을 다룰줄 알아야한다. 하지만 나는 스레드를 다뤄본적이 없기때문에 스레드 다루는 법부터 공부를 해야한다.
해당함수를 이용하여 스레드를 생성을 할 수 가 있다.
프로토타입
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(start_routine)(void ), void *arg);
특정 쓰레드가 종료하기를 기다렸다가, 쓰레그가 종료된 이후 다음 진행
프로토타입
int pthread_join(pthread_t th, void **thread_return);
join된 쓰레드 (종료된 쓰레드)는 모든 자원을 반납하게 됩니다.
특정 쓰레드를 분리시키는 함수
'일반적'으로 쓰레드를 pthread_create() 를 사용하여 생성하면, 쓰레드가 종료되더라도 사용했던 모든 자원이 해제되지 않습니다.
반면 pthread_join() 을 사용하면 종료될때까지 기다렸다가 종료시점이 되면, 자원이 반납됩니다.
pthread_detach() 함수는 pthread_join()을 사용하지 않더라도, 쓰레드 종료될때 모든 자원을 해제 됩니다.
프로토타입
int pthread_detach(pthread_t th);
두 함수 모두 스레드가 종료하면 사용된 자원에 대해서 즉시 free를 한다
다만, join은 두 번째 인자인 void **형태의 반환값을 받아와서 또 다른 제어를 할 수 있다. 하지만 detach는 그런 것 없이 바로 할당된 메모리를 해제한다
그리고 join은 blocking, detach는 non-blocking 함수로, 프로세스인 메인 스레드에서 join의 사용은 뒷 코드의 내용이 바로 실행되지 않는다는 특징이 있다
동기 비동기와 비슷한 개념
blocking과 non-blocking은 주로 IO의 읽기, 쓰기에서 사용된다.
blocking
non-blocking
여기까지가 이번과제에서 사용가능한 함수들
아래부터는 그냥 추가적으로 공부한 함수들
현재 실행중인 thread를 종료시킬때 사용
보통 pthread_exit가 호출되면 cleanup handler가 호출되며 보통 리소스 해제하는 일을 수행한다.
프로토타입
void pthread_exit( void* ret_value );
만약, 쓰레드에서 어떠한 자원을 사용하는게 있었다면 종료하기 전에 반납해야 하는등의 처리를 해야 합니다.
이와 같은 동작을 cleanup handler 함수를 등록하여 수행하게 할수 있습니다.
바로 pthred_cleanup_push() 함수와 pthred_cleanup_pop() 함수 입니다
pthread_exit()가 호출될 때 호출된 handler를 정하는 함수
claenup handler 함수는 자원을 반납하거나, mutex 등의 잠금 해제등을 위한 용도로 사용
프로토타입
void pthrad_cleanup_push(void (*routine) (void *), void* arg);
설정된 cleanup handler를 제거하기 위해서 사용되는 함수
프로토타입
void pthread_cleanup_pop(int exec);
그리고 pthread_cleanup_push 와 pthread_cleanup_pop 은 반드시 같은 함수내의 같은 레벨의 블럭에서 한쌍으로 사용해야 합니다
현재 동작중인 pthread의 식별자를 리턴한다.
프로토타입
pthread_t pthread_self(void);
쓰레드를 분리시키는 방법으로, pthread_detach() 함수대신 '쓰레드 속성' 값을 주어 애초에 생성될때 detach 속성으로 생성되게 할수 있습니다.
이를 위해서는 쓰레드 속성 ( pthread_attr_t ) 과 이를 다루는 다음의 함수들을 사용해야 합니다
쓰레드의 상태를 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);
이런식으로 두번째에 매개변수로 넣어줘야함
프로토타입
int pthread_attr_init(pthread_attr_t *attr);
pthread_attr_init는 쓰레드 속성 객체인 attr을 초기화.
리턴값: 성공할경우 0을 돌려주고 실패할경우 -1
프로토타입
int pthread_attr_destroy(pthread_attr_t *attr);
pthread_attr_init에 의해 생성된 thread attribute 객체인 attr을 제거
제거된 attr 을 다시 사용하기 위해서는 pthread_attr_init를 이용해서 다시 초기화 해주어야 한다.
리턴값: 성공하면 0
학습에 참고한 사이트