Spresense에서 NuttX의 pthreads를 사용하여 다중 스레드 학습 #5~한 번에 다중 스레드의 대기 상태를 모두 해제합니다~

이거 뭐야?


이어서저번 Spresense에서 pthreads 인터페이스를 사용하여 동작을 확인합니다.

이번 주제.


계열 #3, #4는 조건 변수를 사용하여 프로그램의 실행을 기다렸다.시리즈 #3, #4는 조건을 해제했고 조건을 기다리는 단서는 1대 1의 관계였다.이번에 우리는 조건을 해제하는 단서 하나, 여러 단서가 조건을 기다리는 1대 N의 구성을 확인했다.
이번에 사용한 pthreads의 함수는 다음과 같다.
  • pthread_cond_init: 조건 변수의 초기화
  • pthread_cond_wait: 조건 대기
  • pthread_cond_broadcast: 모든 조건 해제 대기 ★ 이번 첫 등장★
  • pthread_cond_destroy: 조건 변수 삭제
  • 환경을 확인하다


    시리즈 1와 같습니다.

    테스트 코드 설명


    이번 테스트 코드는 GiitHub[1]입니다.
    디렉토리, 실행 파일 이름 pthreadcond_브래드캐스트입니다.
    조건 변수로 기다리는 라인은 3개이고 함수 이름은thread입니다cond_wait_5.
    조건이 해제되기를 기다리는 단서는 하나입니다. 함수 이름은thread입니다.cond_브래드캐스트입니다.
    APS 학습판 스위치를 누른 후threadcond_bradcast에서 조건을 해제하고 기다리는 pthreadcond_bradcast를 호출합니다.
    thread_cond_wait_5 대기 조건, 조건 해제 후 라인 종료.

    조건 변수 정의


    조건 변수를 정의합니다.
    pthread_cond_broadcast_main.c//해당 부분 추출 및 기재
    pthread_cond_t switch_cond_5;
    

    조건 변수의 초기화


    사용 조건 변수 pthread-cond_init로 초기화합니다.
    pthread_cond_broadcast_main.cmain 함수//해당 부분 추출 및 기재
    int main(int argc, FAR char *argv[])
    {
    
      if (pthread_cond_init(&switch_cond_5, NULL) != 0) {
          printf("Error; pthread_cond_init.\n");
          exit(1);
      }
      
    }
    

    조건 대기


    조건 대기는threadcond_wait_이루다시리즈 #3, 4와 같습니다.
    무음 록cond_wait로 묶음,threadcond_wait의 매개 변수에 정음을 지정했습니다.
    pthread_cond_broadcast_main.c thread_cond_wait_5 함수//해당 부분 추출 및 기재
    void* thread_cond_wait_5(void* arg) {
      int switch_index = (uint32_t)arg;
    
      printf("thread_cond_wait[%d]:cond_wait[%d]...\n", switch_index, switch_index);
    
      // 条件待ち
      pthread_mutex_lock(&switch_mutex_5);
      if (pthread_cond_wait(&switch_cond_5, &switch_mutex_5) != 0) {
          printf("Fatal error on pthread[%d]_cond_wait.\n", switch_index);
          exit(1);
      }
      pthread_mutex_unlock(&switch_mutex_5);
    
      printf("thread_cond_wait[%d]:wait end.\n", switch_index);
    
      return (void*)switch_index;
    }
    

    조건 해제 대기 중


    조건 대기 해제는 pthreads의 pthread입니다cond_broadcast를 통해 실현됩니다.
    APS 학습판 스위치 1이 눌린 후 pthreadcond_bradcast를 실행하고 매개 변수 조건 변수 등의 모든 단서 대기 상태를 해제합니다.
    pthread_cond_broadcast_main.c thread_cond_broadcast 함수/추출 및 기재 부분
    void* thread_cond_broadcast(void* arg) {
      int switch_index = (uint32_t)arg;
    
      volatile int switch_status = board_gpio_read(aps_board_switch_pin_5[switch_index]);
    
      while (switch_status == 1) {  // スイッチ押下されたらループから抜ける
        switch_status = board_gpio_read(aps_board_switch_pin_5[switch_index]);
        sleep(1);
      }
    
      pthread_cond_broadcast(&switch_cond_5);
    
      printf("thread_cond_broadcast[%d]:switch[%d] pushed!!!cond_signal set.\n", switch_index, switch_index + 1);
    
      return (void*)switch_index;
    }
    

    조건 변수 삭제


    조건 변수가 필요하지 않으면, pthreadcond_destroy를 사용하여 제거합니다.시리즈 #3, 4와 같습니다.
    pthread_cond_broadcast_main main 함수//해당 부분 추출 및 기재
    
    pthread_cond_t switch_cond_5;
    
    int main(int argc, FAR char *argv[])
    {
    
      if (pthread_cond_destroy(&switch_cond_5) != 0) {
          printf("Error; pthread_cond_destroy.\n");
          exit(1);
      }
    
      printf("Bye.\n");
    
      return 0;
    }
    

    동작 확인 결과


    프로그램을 실행한 후 세 개의 라인이 있습니다:threadcond_wait_5 대기 상태입니다.
    APS 학습판 스위치 1을 누르면 pthreads의 pthreadcond_broadcast를 통해 조건 대기를 취소하고 라인을 끝냅니다.
    3개의 단서:threadcond_wait_5 조건 대기 해제 신호를 받은 후, 조건 대기 해제, 종료 라인.
    다음은 APS 학습판의 스위치 1을 누를 때 printf입니다.
    sh> pthread_cond_broadcast
    thread_cond_wait[0]:cond_wait[0]...
    thread_cond_wait[1]:cond_wait[1]...
    thread_cond_wait[2]:cond_wait[2]...
    thread_cond_broadcast[0]:switch[1] pushed!!!cond_signal set.
    thread_cond_wait[0]:wait end.
    thread_cond_wait[1]:wait end.
    thread_cond_wait[2]:wait end.
    main:thread_cond_broadcast[3] exit.return value = 0
    main:thread_cond_wait[0] exit.return value = 0
    main:thread_cond_wait[1] exit.return value = 1
    main:thread_cond_wait[2] exit.return value = 2
    Bye.
    

    동작 확인 방법


    시리즈 1와 같습니다.
    이번 프로그램 이름은 pthread입니다.cond_브래드캐스트입니다.

    이번 소감.


    한 조건에서 여러 단서가 기다리고 있는 상황에서 pthreadcond_브래드캐스트를 사용하면 여러 라인의 기다림을 취소할 수 있음을 확인했습니다.
    한 번에 여러 개의 대기 상태를 해제하는 것은 매우 편리하지만 다른 한편 참고 자료인 리눅스와puthreads의 다중 루틴 프로그래밍 입문[2]에 대한 기록이 인상적이다.

  • 조건 대기 라인에 대해 각 조건 변수가 하나인 디자인을 권장합니다
  • 트리거를 통해 여러 개의 라인을 처리해야 하는 상황에서도 이 라인의 수량에 대한 조건 변수만 준비하고 이 라인의 수량만 준비한다cond_signak 함수를 만듭니다.이렇게 하면 대기 조건의 라인은 각 조건 변수가 하나밖에 없는 것으로 설계할 수 있다
  • 나는 심혈을 기울여 간단하게 설계하고 싶다.
    이번에도 끝까지 읽어주셔서 감사합니다.
    각주
    GiitHub 링크 ↩︎
    서적: 리눅스와 pthreads를 통한 다중 루틴 프로그래밍 입문 링크 ↩︎

    좋은 웹페이지 즐겨찾기