ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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

     

    Pthread API 레퍼런스

    Pthread API 레퍼런스 주의

    www.joinc.co.kr

     

    '공부 > Embedded' 카테고리의 다른 글

    SPI 통신  (0) 2024.04.22
    [라즈베리파이] senseHat LED Controller  (0) 2024.04.17
    [Embedded Linux] 프로세스  (1) 2024.04.02
Designed by Tistory.