본문 바로가기

프로그래밍/C

[C언어]멀티쓰레드 기반의 서버구현

반응형

쓰레드란?

-경량화된 프로세스. 동시실행이 가능하며 프로세스의 단점을 극복하기 위해 등장.

-스택을 제외한 나머지 메모리 공간을 공유

-보다 간단한 context switching

-일부메모리를 공유하므로 스레드간 통신이 편리

 

thread관련 헤더파일은 <pthread.h>

 

int pthread_create( //쓰레드 생성 함수

pthread_t *thread, // 생성된 쓰레드의 ID를 저장할 변수의 포인터를 인자로 전달

pthread_attr-t *attr, //생성하고자 하는 쓰레드의 특성(attribute)를 설정할때 사용. 일반적으로 Null을 전달

void *(*start_routine) (void*), //리턴타입과 인자가 void*인 함수를 가르키는 포인터

void *arg //쓰레드에 의해 호출되는 함수에 전달하고자 하는 인자값을 넘겨줌

);

 

int pthread_join(

pthread_t *th, //th에 인자로 들어오는 ID의 쓰레드가 종료할 때까지 실행 지연

void **thread_return //쓰레드가 종료 시 반환하는 값에 접근할 수 있는 2차원포인터

);

 

'-D_REENTRANT': 불안전한 함수를 컴파일시 이 옵션을 넣어 주는 방식으로 매크로를 선언해 안전한 함수로 변경함.

 

쓰레드의 동기화

-공유된 메모리에 둘 이상의 쓰레드가 동시에 접근하는 것을 막는 방법

-둘 이상의 쓰레드 실행 순서를 컨트롤하는 방법

 

대표적인 동기화 기법

-뮤텍스, 세마포어

 

Mutex

-Mutual Exclusion의 줄임말, 쓰레드들의 동시접근을 허용하지 않음

-Pthread_mutex_t 타입변수를 가르켜 흔히 뮤텍스라고 함.

-임계영역에 들어갈 때 뮤텍스를 잠그고, 빠져 나올 때 뮤텍스를 풀고 나옴

 

초기화: pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *mutexattr)

잠금: pthread_mutex_lock(pthread_mutex_t *mutex)

잠금해제: pthread_mutex_unlock(pthread_mutex_t *mutex)

소멸: pthread_mutex_destory(pthread_ mutex_t *mutex)

 

Semaphore

-sem_t 타입의 변수를 가르켜 흔히 세마포어라고 함

-정수형이며 0이면 실행 불가능, 1이상이면 실행 가능

 

초기화:sem_init (sem_t %sem, int pshared, unsigned int value)

소멸: sem_destory (sem_t *sem)

증가: sem_wait (sem_t *sem)

감소: sem_post (sem_t *sem)

 

 

커널 오브젝트

시스템 리소스의 정보를 담고 있는 데이터 블록

 

 

쓰레드 생성

-IpThreadAttributes: 쓰레드의 보안에 관련된 설정을 위한 옵션. 디폴트보안 설정을 위해 NULL 포인터를 전달

-dwStackSize: 쓰레드 생성 시 요구되는 스택의 크기를 인자로 전달. 0을 전달할 경우 디폴트로 설정되어 있는 스택의 크기를 할당 받음

-IpStartAddress: 쓰레드에 의해 호출되는 함수의 포인터를 인자로 전달.

-IpParameter: IpStartAddress가 가리키는 함수 호출 시, 전달할 인자를 지정.

-dwCreationFlages: 쓰레드 생성 이후에 바로 실행 가능한 상태냐 대기 상태로 들어가느냐를 결정하는 요소. 0을 전달할 경우 바로 실행 가능한 상태가 됨

-IpThreadID: 쓰레드 생성 시 리턴되는 쓰레드의 ID를 저장하기 위한 변수의 포인터

 

멀티 쓰레드 기반 프로그램 작성

다중 쓰레드 기반의 프로그램을 위한 Run-Time Library를 링크

->Multithreaded DLL로 설정

 

함수: unsigned long _beginthreadex

-CreateThread함수와 전달하는 인자의 수, 인자의 의미, 순서가 동이

 

 

 

 

참고:

 

한남대학교 네트워크 실험실입니다.

 

netwk.hannam.ac.kr

 

반응형