pthread API

programming/C_C++ 2017. 11. 21. 09:13
반응형


pthread API

pthread_create : 쓰레드 생성(생성과 동시에 실행)
pthread_join : 해당 쓰레드가 종료 할때까지 대기함( 자식 프로세스를 기다리는 wait와 비슷), pthread_detach 가 호출 되지 않았다면 쓰레드는 종료후 pthread_join이 명시적으로 불릴때까지 자신의 자원을 해제하지 않는다.
pthread_detach : pthread_create 를 통해 생성된 쓰레드를 떼어낸다. pthread_detach 가 호출되면 더이상 pthread_join은 사용될수 없다. 사용할시 오류반환한다. detach 된 쓰레드는 종료시 바로 자원을 해제한다.
pthread_exit : 현재 실행중인 쓰레드를 종료시키고자 할때 사용한다. 만약 pthread_cleanup_push 가 정의 되었다면 pthread_exit 가 호출될 경우 cleanup handler 가 호출된다. (우아한 종료를 위해서) 허나 쓰레드의 강제 종료는 자원이 공유되는 쓰레드의 성질상 매우 위험한 행위이다.
pthread_cleanp_push : cleanup hanlders 를 인스톨하기 위해서 사용된다 . pthread_exit 가 호출되어서 쓰레드가 종료될때 pthread_cleanup_push 로 인스톨된 함수가 자동 호출된다.쓰레드의 강제 종료시 문제가 될수 있는 사항(할당된 자원을 해제)을 이를 이용해 처리해줄 수 있다.
pthread_cleanup_pop : 인스톨된 cleanup handler 를 제거한다.
pthread_self : 현재 쓰래드의 쓰레드 식별자를 되돌려준다. (자바의 Thread.currentThread() 와 동일)


pthread_mutex_init : 뮤텍스 초기화
pthread_mutex_destory : 뮤텍스 제거
pthread_mutex_lock : 뮤텍스 잠금 요청(락되어있다면 락이 풀릴때까지 대기, 락이 않되었다면 락을하고 임계영역 진입)
pthread_mutex_unlock : 뮤텍스 잠금을 해제(락을 푼다.)
pthread_cond_init : 조건변수/상태변수를 초기화 (조건변수/상태변수는 윈도우의 이벤트 오브젝트와 같은것이다.)
pthread_cond_signal : 조건변수/상태변수에 시그날을 보낸다. 시그날을 보낼 경우 cond르 기다리는 쓰레드가 있다면 쓰레드를 깨운다. (java의 notify() 함수 같은것) 여러개의 쓰레드가 존재한다면 임의의 쓰레드를 깨운다.
pthread_cond_boradcast : 조건변수/상태변수를 기다리는 모든 쓰레드에게 신호를 보낸다. (java의 notifyAll() 함수와 같다.)
pthread_cond_wait : 조건변수/상태변수 에 시그날이 도착할때까지 대기한다 시그날이 도착하면 블락에서 풀린다. pthread_cond_wait는 블럭 되기 전에 mutex잠금을 자동으로 되돌려주고 시그날에 의해 블럭이 풀리면 mutex를 잠근다.
pthread_cond_timedwait : 조건변수/상태변수 에 시그날이 도착할때까지 abstime(절대시간) 동안 대기한다. 시그날이 전달될때까지 블럭되며 자동으로 mutex를 돌려준다. 중요!! abstime 이란 절대시간이다. 예를 들어 10분만 기달려가 아니라 9시10분까지 기달려란 의미다.
pthread_cond_destroy : pthread_cond_destory 를 통해 생성한 조건변수/상태변수 에 대한 자원을 해제한다.

중요 : 쓰레드 조건/상태변수는 원자성을 보장하지 않으므로 뮤텍스와 같이 임계영역내에서 사용되어야 한다.

pthread_attr_init : thread attribute 객체를 디폴트 값으로 초기화
pthread_attr_destory : thread attribute 객체를 제거
pthread_attr_getscope : 쓰레드가 어떤영역(커널/유저) 에서 다루어지고 있는지를 얻어오기 위해서 사용된다. PTHREAD_SCOPE_SYSTEM 은 유저모드 쓰레드이고 PTHREAD_SCOPE_PROCESS 는 커널모드 쓰레드이다. 리눅스의 경우는 유저모드 쓰레드만 있다.
pthread_attr_setscope : 쓰레드가 어떤 영역(커널/유저)에서 작동하게 할것인지 결정하기 위해서 사용한다. 리눅스의 경우 커널 모드 쓰레드가 지원하지 않는다.
pthread_attr_getdetachstate : 쓰레드가 join 가능한 상태인지 아닌지를 알아보는 함수이다.
pthread_attr_setdetachstate : 쓰레드가 join 가능하게 아니면 detach 상태로 만들기 위한 함수이다.


pthread_sigmask : 쓰레드에서 시그널은 서로 공유된다. 그런 이유로 만약 프로세스에 시그널이 전달되면 프로세스가 생성한 모든 쓰레드로 시그널이 전달된다. 그러나 특정 쓰레드만 시그널을 받도록 하고 싶을때 이 함수를 이용한다.
pthread_kill : 쓰레드 식별번호로 signal 를 전달한다. (kill 과 같다.)
sigwait : 시그날 전달을 동기적으로 기다린다.


pthread_cancel : 쓰레드 취소(종료)
pthread_setcancelstate : 쓰레드를 취소 가능하게 할지 안할지 결정
pthread_getcancelstate : 쓰레드가 취소 가능한지 안 한지 반환


pthread_key_create : 쓰레드 개별 공간(thread specific data) 영역 만들기.
pthread_setspecific : TSD(thread specific data) 영역에 값쓰기
pthread_getspecific : TSD 영역에 값 읽기
pthread_delete : TSD 영역 없애기 (키 없애기)


쓰레드는 부모 프로세스가 시그널을 받게 되면 그 시그널은 쓰레드전체에게 영향을 준다.
그리고 pthread 함수는 대부분 시그널에 안전하지 않다.
따라서 쓰레드가 시그널을 처리하지않도록 쓰레드 생성시 pthread_sigmask 함수를 이용하여 시그널을 블락시키는 것이 좋다.

 

pthread API (IBM 문서) : http://publib.boulder.ibm.com/iseries/v5r2/ic2924/index.htm?info/apis/users_35.htm
자세한 pthread api 관련 : www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Thread
pthread_cond_timedwait 예제 : http://blog.daum.net/_blog/BlogTypeView.do?blogid=0Idq4&articleno=6301190#ajax_history_home
pthread 기본 함수들 예제 : http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Thread/Beginning/PthreadApiReference
Thread safety (쓰레드에 안전한 함수) http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/concurrency_parallel
조건변수 와 TSD (thread specific data) http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Thread/Advanced/DeepThread#AEN23
조건변수 예제 http://www.joinc.co.kr/modules/moniwiki/wiki.php/man/3/pthread_cond_wait?cx=002661009167463862046%3A8oq6cxlfibu&cof=FORID%3A9&q=pthread_cond_wait&sa=Search&ie=EUC-KR#1257

[출처]http://onecellboy.tistory.com/179

반응형
Posted by 공간사랑
,