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 |
댓글