본문 바로가기
2023-1/IoT와 임베디드 소프트웨어

Threads

by 철없는민물장어 2023. 6. 13.
728x90

 

스레드는 lightweight process라고도 부른다.

스레드는 전역변수나, 동적할당을 통한 값들을 서로 공유할 수 있고,

프로세스에 비해 오버헤드가 적다는 장점을 갖는다.

 

int pthread_create(스레드id 저장할 변수포인터,null(특성),함수포인터,(void *)인자)

스레드를 생성.

 

메인 프로그램이 종료되면 스레드도 종료된다.

스레드가 종료되기까지 대기하기 위해서 pthread_join 함수를 쓸 수 있다.

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

인자로는 스레드id, 반환값을 저장할 변수 포인터를 넘겨주면 된다.

 

임계영역

여러 스레드가 동시에 접근할 수 없는 영역.

자원이 공유되는데, 여러 스레드가 읽고 쓰는 연산을 진행하면 예상치 못한 일이 벌어진다.

 

임계영역을 설정하는 방법은 

-Mutex

-Semaphore

이 있다.

 

Mutex

 

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);

init에서 두번째 인자는 null을 주면 됨.

 

그런데 뮤텍스를 설정했다 하더라도,,

A,B라는 스레드가 있다고할때

뮤텍스 언락이 되는순간 A가 실행될지 B가 실행될지는 아무도 모른다.

 

 

Semaphore

들어갈 수 있는 수를 지정할 수 있다.(뮤텍스는 1개의 스레드)

 

sem_init(sem_t * sem, int pshared, unsigned int value);

sem_destroy(sem_t *sem);

sem_wait(sem_t * sem);

sem_post(sem_t * sem);

세마포어는 post를 통해 임계영역에 들어갈 수 있는 스레드 수를 증가시키고

wait으로 감소시키는 방식으로 사용된다.

 

예를들어 빵집에서 빵을 팔 때, 제빵사가 빵을 만들면 post를 실행하여 빵개수를 1늘리고,

소비자가 빵을 가져가면 wait을 실행하여 빵개수를 -1하는것으로 이해하면 된다.

728x90

'2023-1 > IoT와 임베디드 소프트웨어' 카테고리의 다른 글

Device Driver 2  (0) 2023.06.13
Device Driver Concept  (0) 2023.06.13
CrossDevEnv, Kernel, BootLoader  (0) 2023.04.25
Embedded Linux  (0) 2023.04.25
IoT and Embedded Software  (0) 2023.03.11

댓글