Pthread 라이브러리에서 스레드 제거
사용하고 있다pthread_create(&thread1, &attrs, //... , //...);
그리고 만약 어떤 상황이 발생한다면 이 스레드를 어떻게 죽일 필요가 있는가?
먼저 스레드 ID 저장
pthread_create(&thr, ...)
그럼 나중에 전화해요.
pthread_cancel(thr)
그러나 이는 권장되는 프로그래밍 연습이 아닙니다!세마포어나 메시지와 같은 스레드 간 통신 메커니즘을 사용하여 스레드가 실행을 중지해야 함을 전달하는 것이 좋습니다.
pthread_kill(...)은 실제로 수신 스레드를 종료하는 것이 아니라 스레드에 신호를 전달하는 것에 주의해 주십시오.이것은, 발생하는 신호와 신호 핸들러에 의해서 다릅니다.
이 문제에는 두 가지 접근법이 있습니다.
- 신호 사용:스레드는 다음 명령을 사용하여 신호 핸들러를 설치합니다.
sigaction()
플래그를 설정하고 스레드는 플래그가 종료되어야 하는지 여부를 정기적으로 확인합니다.스레드가 종료되어야 하는 경우 다음을 사용하여 스레드에 신호를 발행하십시오.pthread_kill()
종료될 때까지 기다립니다.pthread_join()
이 방법에서는 부모 스레드와 자녀 스레드 간의 사전 동기화가 필요하며, 자녀 스레드가 종단 신호를 처리하기 전에 신호 핸들러가 이미 설치되어 있는지 확인해야 합니다. - 취소 지점 사용:취소 기능이 실행될 때마다 스레드는 종료됩니다.스레드가 종료되어야 하는 경우 실행
pthread_cancel()
종료될 때까지 기다립니다.pthread_join()
이 접근방식에서는, 다음의 상세하게 사용할 필요가 있습니다.pthread_cleanup_push()
그리고.pthread_cleanup_pop()
리소스 유출을 방지합니다.이러한 마지막 2개의 콜은 코드의 어휘적 범위에 영향을 줄 수 있습니다(이러한 콜은 매크로로 인해{
그리고.}
토큰)을 올바르게 유지하기가 매우 어렵습니다.
(이미 스레드를 분리한 경우에는pthread_detach()
, 를 사용하여 다시 가입할 수 없습니다.pthread_join()
.)
두 방법 모두 매우 까다로울 수 있지만, 주어진 상황에서 특히 유용할 수 있습니다.
다음 항목을 참조하십시오.pthread_kill()
기능.
Anti의 의견에 동의합니다.더 좋은 방법은 스레드가 종료해야 하는지 여부를 체크하는 체크포인트를 구현하는 것입니다.이러한 체크포인트는 잠금 기능이 있는 공유 변수나 스레드가 설정된 경우 체크하는 이벤트(스레드는 제로 타임 대기 선택 가능) 등 다양한 방법으로 구현할 수 있습니다.
pthread_exit(0)
이렇게 하면 실이 끊어집니다.
언급URL : https://stackoverflow.com/questions/2084830/kill-thread-in-pthread-library
'programing' 카테고리의 다른 글
MariaDB 문자 인코딩 (0) | 2023.01.20 |
---|---|
쿼리 조건이 JPA 및 스프링을 충족하는 경우 행 삽입 (0) | 2023.01.20 |
WordPress 설치의 wp_options 테이블에서 과도 상태를 제거할 수 있습니까? (0) | 2023.01.20 |
MySQL 날짜 문자열을 Unix 타임스탬프로 변환 (0) | 2023.01.20 |
통신 링크 장애: 1047 WSREP에서 어플리케이션용 노드가 아직 준비되지 않았습니다. (0) | 2023.01.20 |