본문 바로가기
linux

쓰레드를 사용해보자...ㅋㅋ

by 상레알 2009. 7. 28.
음...여기저기서 가져왓는대 어딘지 -_-;;

쓰레드를 이용하여 프로그램을 병렬적으로 작성할 경우 원하는 기능을 보다 빠르게 수행할 수 있다.
쓰레드 생성은 프로세스 생성에 비해 시스템 자원을 많이 소비하지 않고 가볍게 동작하기 때문에 네트워크 프로그래밍에서 다중 접속을 처리 할 때나 프로세서 내의 동일 작업을 병렬적으로 처리 할 때 많이 사용되는 기법이다.

쓰레드는 흔히 경량 프로세스, 세미 프로세스라 지칭하는데, 프로그램에서 수행하는 명령의 흐름을 동시에 처리하도록 하는 것이 가장 큰 특징입니다. 일반적으로 프로세스의 경우 프로그램 명령들이 단일적으로 혹은 순차적으로 처리되지만, 쓰레드를 사용하게 되면 프로그램 명령들을 병렬적으로 처리할 수 있기 때문에 매우 빠른 속도로 동작할 수 있게 됩니다. 예를 들어 수행해야 할 작업이 많은 프로그램일 경우 쓰레드 사용 여부에 따라 처리 속도가 대략 스무 배 이상 차이가 날 수 있습니다. 이외에도 쓰레드 간에는 공유 메모리 공간을 갖고 있기 때문에 프로그램 구현이 편리하다는 장점이 있다.

단점으로는 작업을 수행하는 도중, 동시에 특정 메모리에 접근했을 때  문제를 일으킬 수도 있다. 또 동작중인 여러 개의 쓰레드 중 하나라도 잘못된 연산을 하게 될 경우 운영체제에 의해 프로세스 전체가 죽게됩니다. 그리고 여러 명령이 동시에 실행되기 떄문에 디버깅 작업이 어렵다는 단점이 있다. 
 

함   수
 

① 쓰레드 생성

#include<pthread.h>

int pthread_create(pthread_t * thread, pthread_attr_t * attr, void *(*start_routine)(void* ), void *arg);

◇ thread :  쓰레드 식별자, 다른 쓰레드와 구분될 수 있는 ID를 할당받게 된다.
◇ attr : 생성되는 쓰레드의 특성을 정하기 위해 사용되는데, 일반적으로 NULL 을 사용한다.
◇ start_routine : 리턴 타입이 void*이고 인자도 void*인 함수 포인터로 쓰레드가 실행시킬 쓰레드 함수
◇ arg : 쓰레드에 의해 호출되는 함수 (start_routine 포인터에 대입된 함수)에 전달되는 함수 인자.

이 함수에서  중요한 인자는 쓰레드 식별자 (thread)와, 쓰레드 생성시 호출되는 함수(start_routine)이다.

② 쓰레드 기다림

#include<pthread.h>

int pthread_join (pthread_t th, void **thread_return);

◇ th : 쓰레드가 종료할 때까지 기다리는 쓰레드 식별자
◇ thread_return : 쓰레드가 종료시 반환하는 값에 접근할 수 있는 포인터

생성된 쓰레드가 종료될 때까지 기다리기 위한 함수, 만약 프로세스가 쓰레드를 생성한 후에 쓰레드가 종료할 때까지 기다리지 않고 프로세스를 종료하면 쓰레들도 동시에 모두 종료되기 떄문에 모든 쓰레드를 안전하게 실행시키기 위해서 반드시 사용되어야 하는 함수


③ 쓰레드 식별자 반환

#include<pthread.h>

int pthread_self();

pthread_self 함수를 실행하면 해당 쓰레드의 식별자를 반환해줌


④ 쓰레드 분리

#include<pthread.h>

int pthread_detach(pthread_t th);

◇ th : 메인 쓰레드에서 분리할 쓰레드 식별자이고, 쓰레드가 분리되면 종료되면서 자원을 즉시 해제시켜 준다.


⑤ 쓰레드 종료

#include<pthread.h>

int pthread_exit(void *retval);

현재 실행 중인 쓰레드를 종료시킬 때 사용되는 함수, 종료 후에 pthread_join 함수를 통하여 모든 자원을 해체



스레드 동기화 API

스레드는 하나의 프로세스에서 나위어진 것으로 데이터를 공유할 수 있다. 여러 개의 스레드가 전역 변수에 접근하는 경우에 문제가 발생할 수 있는데 이것을 임계영역 (Critical Section)으로 볼 수 있다. 여기에서는 뮤텍스(mutex)를 사용하여 데이터 동시 접근 문제를 해결한다. 뮤텍스를 지원하는 pthread의 함수를 알아보자


#include<pthread.h>

int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
int pthread_mutex_destroy(pthread_mutex_t *mutex);

◇ pthread_mutex_init : 뮤텍스를 사용하기 전에 초기화 과정을 거치기 위한 함수 입니다. 첫 번째 인자에는 초기화하고자 하는 뮤텍스 포인터를 넘기고, 두 번째 인자에는 뮤텍스 속성(attribute)를 설정할 때 사용합니다. 속성을 사용하지 않을 때는 NULL 포인터를 넘깁니다.

◇ pthread_mutex_lock : 뮤텍스를 걸어 잠글 때(lock) 사용하는 함수입니다. 뮤텍스를 걸어 잠그면 후에 진입하는 스레드는 뮤텍스가 풀릴 때까지 대기하게 된다.

◇ pthread_mutex_unlock : 뮤텍스를 풀어줄 때 사용하는 함수 , 뮤텍스를 잠그면 반스시 풀어줘야 다른 스레드들이 진입할 수 있다.

◇ pthread_mutex_destroy : 더 이상 뮤텍스르 사용하지 않고 이와 관련된 리소를 해체할때 사용하는 함수



'linux' 카테고리의 다른 글

상대 ping 거부하기..  (0) 2010.04.02
echo  (0) 2010.03.18
러닝리눅스 [개정5판] - 한빛미디어  (0) 2009.11.09
Unix 와 Linux  (0) 2009.11.09
gcc 옵션  (0) 2009.08.14
rlogin  (0) 2009.08.12
스레드 동기화 API  (0) 2009.08.09
셸 프로그래밍  (0) 2009.07.24
gdb 디버깅  (0) 2009.05.05
iptable  (0) 2008.12.21