공부/Embedded

[Embedded C] Thread

래울 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

 

Pthread API 레퍼런스

Pthread API 레퍼런스 주의

www.joinc.co.kr