티스토리 뷰

what? 

멀티태스킹 방법중 하나로 둘 이상의 스레드를 생성하는 프로그램이다.

하나의 컴퓨터에서 병렬로 여러 작업을 처리할 경우 멀티 스레드 방식이 사용될 수 있다.

멀티프로세스 프로그램과 달리 복잡한 프로세스간 통신 기능을 사용하지 않아도 스레드간 데이터 공유가 쉽게 이루어진다.

 

how?

한 프로세스 내에서 생성된 스레드들은 서로 전역 변수를 공유하므로 스레드간 데이터를 편리하게 공유할 수 있다.

 

- 스레드 생성과 종료

<pthread_create()를 통한 스레드 생성>

//pthread_create()

int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine) (void *), void *arg)
// thread : 스레드가 정상생성된 경우 ID가 저장됨 => pthread_t 타입의 ID를 통해 스레드에 접근 가능
// attr : 스레드 속성을 지정하는 인자
// start routine : 스레드 시작 함수
//성공시, 0을 리턴/ 에러가 발생할 경우 -1이 아니라 에러코드를 정수 값을 리턴한다. 

=> errno가 여러 스레드에 공유되어 사용되어 에러코드가 errno에 저장되었을 경우 어떤 스레드로 인해 발생했는데 정확히 알기 어려워서 errno에 저장하지 않는 것이다.

=> 그러나, 현재 시스템 콜들 대부분은 여전히 errno를 사용한다. 따라서 POSIX을 이용해야한다.

%POSIX : 스레드별로 errno를 제공해서 문제를 해결할 수 있다.(오버헤드가 크다는 단점이 있긴하며 -D_REENTRANT옵션)

 

<ptread_self와 phtread_exit을 통한 ID얻기와 종료>
//pthread_self() => 자신의 프로세스 ID를 알아내기 위해 사용
pthread_t pthread_self(void);

//pthread_exit() => 스레드를 스스로 종료
pthread_exit()

=> main함수도 일종의 스레드. main에서 여러 스레드를 생성 후 return시 프로세스를 종료. 여러 스레드를 생성한 후에 return하면 모든 자식 스레드들도 종료되는데 pthread_exit()을 할 경우 main 스레드만 종료되고 생성시킨 스레드들은 종료되지 않고 모든 자식 스레드가 종료될 때까지 프로세스는 종료되지 않는다.

 

<pthread_join()>

자식 스레드가 종료할 때까지 기다려야 할 경우 pthread_join()을 사용

=> 자식 스레드가 종료되기 전에 부모 스레드가 먼저 종료되면 자식 스레드들이 종료전에 부모 스레드가 종료되면 자식 스레드들도 모두 함께 종료되기때문이다.

 

스레드 취소

- 스레드가 다른 스레드의 실행을 종료시키는 것을 스레드 취소라고 함

- 이때, cancel request를 보낼 수 있으며

1. 취소요청 수락 [ cancellation point에서 항상종료, cancellation point에서 즉시취소, cancellation porint까지 대기 후 지연취소] / cancellation point로 pthread_join( ), read(), write(). open()등이 존재

2. 취소요청 무시

로 취소요청을 수신한 스레드는 미리 설정해놓은 대로 처리함

- 이때, 취소 관련 함수에는

1. 취소 요청을 받아들일 것인지 말것인지 설정하는 함수

2. 취소요청을 받아들이는 경우에 그 요청을 cancellation point를 기준으로 어떻게 나눌 것인지 [기다림 or 즉시취소] 설정하는 함수

로 두가지가 있다.

 

//취소요청을 받아들일 것인지 결정하는 함수 => cancelstate를 저장하는 함수

int pthread_setcancelstate(int state, int *oldstate)

/*
state :  1. PTHREAD_CANCEL_ENABLE(수락) // 2. PTHREAD_CANCEL_DISABEL(거절)
oldstate : 이전 취소 상태 값 저장 => NULL(이전 취소 상태 값 저장 안 함)
*/

//취소요청 수락의 경우, TYPE을 설정하는 함수

int pthread_setcanceltype(int type, int *oldtype)

/*
type : 1. PTHREAD_CANCEL_ASYNCHRONOUS (즉시취소) // 2. PTHREAD_CANCEL_DEFERRED(concellation point까지 대기)
oldtype : 이전 type값을 나타내고 => NULL일때는 이전정보 없음
*/

=> 함수들이 정상 성공하면 0을 return

 

- pthread_setcancelstate(int state, int *oldstate)

: state(취소요청 수용 여부 결정)를 ENABLE, DISABLE로 나눔

- pthread_setcanceltype(int type, int *type)

: type(수락 시 처리할 시점을 결정)을 ASYNCHRONOUS와 DEFERRED로 나눔

 

 

 

 

why? 왜 사용?

하나의 프로세스 안에서 다양한 작업을 병렬 처리해야 할 때 다중화 방식을 도입해야 하고 하나의 프로세스를 사용하기 때문에 멀티 프로세스가 아니라 멀티 스레드를 사용해서 하나의 컴퓨터 하나의 프로세스에서 여러 작업을 처리할 수 있게 된다.


다음에는 취소요청과 관련한 다양한 케이스들에 대해 우분투를 활용해 코드를 작성해보며 자세히 알아보자.

'네트워크프로그래밍' 카테고리의 다른 글

뮤텍스 [ 스레드 경쟁과 동기화문제]  (0) 2021.06.02
스레드 취소요청  (0) 2021.06.02
세마포어(2)  (0) 2021.05.31
세마포어  (0) 2021.05.31
소켓 옵션 변경  (0) 2021.05.27