IOT네트워크프로그래밍

멀티쓰레드 기반의 서버구현

CMS419 2021. 10. 12. 20:01

쓰레드

'경량화된 프로세스'라고 생각하면 편하다.

프로세스의 단점을 보안하기 위해 나왔다.

리눅스 gcc 에서 쓰레드를 사용하려면, 컴파일 생성 명령어 맨 뒤에 -lpthread라고 해줘야 한다.

프로세스와의 차이점

  • 스텍을 제외한 나머지 메모리 공간을 공유
  • 일부 메모리를 공유하므로 스레드간 통신이 편리하다.

쓰레드를 생성하는 함수

Pthread_create 함수

#include <pthread.h>

int pthread_create (pthead_t * thread,
                            pthread_attr-t * attr,
                            void * (* start_routine) (void *),
                            void * arg
);  성공 시 0, 실패 시 이외의 값 리턴
  • thread : 생성된 쓰레드의 ID를 저장할 변수의 포인터를 인자로 전달
  • Attr : 생성하고자 하는 쓰레드의 특성(attribute)을 설정할 때 사용, 일반적으로 Null을 전달
  • Start_routine : 리턴타입과 인자가 void*인 함수를 가르키는 포인터
  • Arg : 쓰레드에 의해 호출되는 함수에 전달하고자 하는 인자값을 넘겨줌

pthread_join 함수

main 함수가 종료되면, 쓰레드도 함께 종료된다.

이것을 방지하기 위해서 main 함수를 대기 상태로 만들어, 쓰레드가 종료될 때까지 기다리게 한다.

#include <pthread.h>

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

 성공 시 0, 실패 시 이외의 값 리턴
  • th : th에 인자로 들어오는 ID의 쓰레드가 종료할 때까지 실행 지연
  • thread_return : 쓰레드가 종료 시 반환하는 값에 접근할 수 있는 2차원포인터

다중 쓰레드 생성하기

임계영역(Critical Section)과 쓰레드에 안전한 함수의 호출

임계영역

두개 이상의 쓰레드에 의해서 동시에 실행되면 안 되는 영역

 

불안전한 함수를 안전한 함수로 변경

컴파일시 –D_REENTRANT를 옵션으로 넣어 주는 방식으로 매크로를 선언

임계영역 & 쓰레드의 문제점

 

계산 대로 안되고, 문제가 생긴다.

임계영역(Critical Section)

  • 두개 이상의 쓰레드에 의해서 공유되는 메모리 공간에 접근하는 코드영역

동기화 : 문제 해결 방법

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

기법

  • 뮤텍스, 세마포어

뮤텍스 Mutex

쓰레드들의 동시접근을 허용하지 않겠다는 의미

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_destroy (pthread_mutex_t *mutex)

세마포어 Semaphore

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

기본원리

정수를 가짐

정수 값이 0 이면 실행 불가능

세마포어가 1 이상이면 실행 가능

세마포어는 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)