쓰레드란?
-경량화된 프로세스. 동시실행이 가능하며 프로세스의 단점을 극복하기 위해 등장.
-스택을 제외한 나머지 메모리 공간을 공유
-보다 간단한 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함수와 전달하는 인자의 수, 인자의 의미, 순서가 동이
참고:
'프로그래밍 > C' 카테고리의 다른 글
[C언어]제곱을 구하는 pow함수! 음수의 제곱도 구할 수 있을까? (0) | 2020.10.01 |
---|---|
[C언어]부동소수점으로 저장된 데이터를 정수형으로 바꾸기 (0) | 2020.09.30 |
[C언어]CMD Printf 고급 스킬! (c언어 커서 위치 바꾸기) (0) | 2020.09.30 |
[C언어]INI파일 사용하기 (GetPrivateProfileString) (0) | 2020.09.30 |
[C언어]C언어 시리얼통신 - CreatFile (RS232, RS485 등) (0) | 2020.09.30 |