-
멀티쓰레드 기반의 서버구현IOT네트워크프로그래밍 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)
'IOT네트워크프로그래밍' 카테고리의 다른 글
멀티플렉싱 SELECT (0) 2021.11.02 멀티캐스트와 브로드 캐스트 (0) 2021.10.19 다중 접속 서버 (0) 2021.10.05 UDP기반의 Client/Server (0) 2021.09.28 TCP 기반의 Client / Server (0) 2021.09.28