-
[Embedded C] Thread공부/Embedded 2024. 4. 1. 17:20
Process 구성
.text : 코드 영역
.data : 초기화된 전역변수
.bss : 초기화 하지 않은 전역변수
.heap : 동적할당 변수들
.stack : 지역 변수들
POSIX thread
POSIX API : Portable Operating System InterFace for Unix의 약자로 IEEE에서 지정한 운영체제간 호환성을 유지하기 위한 표준
POSIX thread : pthread.h
위치 : /usr/include/pthread.h
thread 사용 시, pthread 라이브러리를 같이 링킹 해야한다.
- gcc -o ./test ./test.c -lpthread
#include <stdio.h> #include <pthread.h> #include <unistd.h> void *test1(){ while(1) { printf("t1\n"); sleep(1); } } void *test2() { while(1) { printf("t2\n"); sleep(1); } } int main() { pthread_t t1, t2; pthread_create(&t1, NULL, test1, NULL); pthread_create(&t2, NULL, test2, NULL); pthread_join(t1, NULL); pthread_join(t2, NULL); return 0; }
스레드 간 순서를 보장하지는 않기 때문에, 뒤섞여서 출력된다.
pthread_t 구조체 : Thread 핸들러, 쓰레드를 제어하거나 정의할 때 사용
int pthread_create(thread id, thread 속성, 함수, 파라미터) : 쓰레드를 생성하는 함수
- thread id : 쓰레드 구조체의 주소 (pthread *)
- thread 속성 : const pthread_attr_t*
- 함수 : 쓰레드로 실행할 함수의 주소 (void*)
- 파라미터 : 쓰레드로 실행할 함수에 인자 값을 전달 (void*)
int pthread_join(pthread_t th, void **thread_return) : thread가 종료되는 것을 기다림
- thread_id : 기다릴 쓰레드 핸들러
- thread_return : 쓰레드의 반환 값
Thread 문제
다음과 같은 코드를 실행하면, 0 ~ 9 가 출력되기를 기대한다.
하지만, 출력은 0 ~ 10 사이의 수 중 랜덤하게 10 개가 출력된다.
각 쓰레드에 변수 i 의 주소를 건네주지만, 해당 주소를 언제 참조할지는 모르기 때문이다.
0 ~ 9 까지의 수가 단 한 번씩 출력되게 하고 싶으면 다음과 같이 코드를 작성할 수 있다.
Mutex
뮤텍스(Mutex) : Mutual Exclusion, 프로세스가 서로 간에 공유 자원의 동시 접근을 허용하지 않기 위한 기술
공유 자원에 접근 시, 키를 이용해서 다른 쓰레드/프로세스의 접근을 막는다.
Critical Section을 진입할 때, Lock을 하고 Critical Section을 모두 수행한 뒤, Unlock한다.
하나의 쓰레드/프로세스가 공유 자원을 사용하면, 다른 쓰레드/프로세스는 대기한다.
void *run(void *arg){ int cnt = *(int*)arg; printf("%d thread start\n", cnt); while(1) { pthread_mutex_lock(&mlock); coin += 1; pthread_mutex_unlock(&mlock); usleep(100000); } }
API Reference
https://www.joinc.co.kr/w/Site/Thread/Beginning/PthreadApiReference
'공부 > Embedded' 카테고리의 다른 글
용어 정리 (0) 2024.04.28 STM32 - Firmware LED / Timer (0) 2024.04.24 SPI 통신 (0) 2024.04.22 [라즈베리파이] senseHat LED Controller (0) 2024.04.17 [Embedded Linux] 프로세스 (1) 2024.04.02