Spresense에서 NuttX의 pthreads를 사용하여 다중 스레드 학습 #5~한 번에 다중 스레드의 대기 상태를 모두 해제합니다~
이거 뭐야?
이어서저번 Spresense에서 pthreads 인터페이스를 사용하여 동작을 확인합니다.
이번 주제.
계열 #3, #4는 조건 변수를 사용하여 프로그램의 실행을 기다렸다.시리즈 #3, #4는 조건을 해제했고 조건을 기다리는 단서는 1대 1의 관계였다.이번에 우리는 조건을 해제하는 단서 하나, 여러 단서가 조건을 기다리는 1대 N의 구성을 확인했다.
이번에 사용한 pthreads의 함수는 다음과 같다.
환경을 확인하다
시리즈 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]에 대한 기록이 인상적이다.
조건 대기 라인에 대해 각 조건 변수가 하나인 디자인을 권장합니다
이번에도 끝까지 읽어주셔서 감사합니다.
각주
GiitHub 링크 ↩︎
서적: 리눅스와 pthreads를 통한 다중 루틴 프로그래밍 입문 링크 ↩︎
Reference
이 문제에 관하여(Spresense에서 NuttX의 pthreads를 사용하여 다중 스레드 학습 #5~한 번에 다중 스레드의 대기 상태를 모두 해제합니다~), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/k_abe/articles/51ccd55f6a67de텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)