나는 pthread_create(&thread1, &attrs, //... , //...);
을 사용하고 어떤 상황이 발생하면이 스레드를 어떻게 죽일 필요가 있는지를 알아야합니까?스레드를 Pthread 라이브러리에서 죽이기
35
A
답변
50
먼저 가게 스레드 ID
pthread_create(&thr, ...)
는 나중에 그러나
pthread_cancel(thr)
이 아닌 권장 프로그래밍 연습 불러! 실행을 중지해야하는 스레드와 통신하려면 세마포 또는 메시지와 같은 스레드 간 통신 메커니즘을 사용하는 것이 좋습니다.
pthread_kill (...)은 실제로 수신 스레드를 종료하지 않고 대신 신호를 전달하며 신호 처리기와 신호 처리기에 따라 다릅니다.
2
5
Antti에 동의합니다. 스레드가 종료해야하는지 확인하는 일부 검사 점을 구현하는 것이 좋습니다. 이러한 체크 포인트는 여러 가지 방법으로 구현 될 수있다. 예를 들어, 잠금을 가진 공유 변수 또는 스레드가 설정되어 있는지 (스레드가 제로 시간 동안 대기하도록 선택할 수 있는지) 검사한다.
18
이 문제에는 두 가지 방법이 있습니다.
- 는 신호를 사용하여 스레드는 플래그를 설정
sigaction()
를 사용하여 신호 처리기를 설치하고, 스레드는 주기적으로 종료해야하는지 여부를 확인하기 위해 플래그를 확인합니다. 스레드를 종료해야 할 때pthread_kill()
을 사용하여 신호를 보내고pthread_join()
으로 종료 될 때까지 기다리십시오. 이 방법은 자식 스레드가 종료 신호를 처리하기 전에 신호 처리기를 이미 설치했음을 보장하기 위해 부모 스레드와 자식 스레드 간의 사전 동기화가 필요합니다. - 취소 지점 사용 : 취소 기능이 실행될 때마다 스레드가 종료됩니다. 스레드를 종료해야하는 경우
pthread_cancel()
을 실행하고pthread_join()
과 함께 종료 될 때까지 기다립니다. 이 방법은 자원 누출을 방지하기 위해pthread_cleanup_push()
및pthread_cleanup_pop()
의 자세한 사용을 필요로합니다. 이 마지막 두 호출은 코드의 어휘 범위를 엉망으로 만들 수 있습니다 (매크로가{
및}
토큰을 생성 할 수 있기 때문에). 제대로 유지 관리하기는 매우 어렵습니다.
(이미 pthread_detach()
를 사용하여 스레드를 분리 한 경우, 다시 pthread_join()
를 사용하여 가입 할 수 없습니다.)
두 가지 접근법은 매우 까다로운 일이 될 수 있지만, 하나가 주어진 상황에서 특별히 유용 할 수 있습니다.
0
pthread_exit(0)
이렇게하면 스레드가 종료됩니다.
관련 문제
- 1. 대기 스레드를 깨우는 pthread 기반 이벤트
- 2. pthread 뮤텍스가 같은 스레드를 잠금 해제합니까?
- 3. OS에서 Java 쓰레드 죽이기
- 4. PThread 모니터링
- 5. threadpoolexecutor 죽이기
- 6. 자바 스레드 죽이기 또는 종료
- 7. pthread 스레드 풀 시나리오
- 8. PyInstaller로 하위 프로세스 죽이기
- 9. 무조건적으로 프로세스 죽이기 (Windows)
- 10. Xcode 시뮬레이터에서 앱 죽이기
- 11. pthread 스케쥴링하기
- 12. pthread multithreading
- 13. pthread threadpool?
- 14. pthread 스레드가 블로킹되어 있는지 확인하십시오.
- 15. pthread 릴리스에서 메모리를 해제 했습니까?
- 16. Pthread 대기열 시스템
- 17. Pthread Barrier 대 Loop Join
- 18. 안전하게 .bat 파일에서 프로세스 죽이기
- 19. 메인이 pthread 후에 계속되지 않습니다
- 20. 구조체에서 pthread 조건 대기를 사용합니다.
- 21. 응용 프로그램에서 최대 pthread 수 제한 변경
- 22. 어도비 '연금술'은 posix pthread 라이브러리를 지원합니까?
- 23. pthread 스레드 상태
- 24. pthread 컨텍스트 스위칭 모니터링
- 25. C pthread 분할 오류
- 26. pthread 라이브러리 문제 연결
- 27. PThread 대 boost :: thread?
- 28. 리눅스에서 pthread 실행
- 29. C++에서 pthread 사용
- 30. Pthread 반환 결과
pthread_cancel, btw의 문제는 사용하는 경우 취소 된 스레드에서 실행중인 코드가 취소 지점을 이해하고 (a) 충분히 자주 취소되어 실제로 취소 된 코드인지 확인해야한다는 것입니다 (b) 이러한 일이 발생하면 자원이 누출되지 않습니다. 이것은 다소 까다 롭습니다. 반면에 메시지를 사용하면 스레드가 종료 될 때 정확히 코드에서 명확하게 명시됩니다. –
@Steve : 유감스럽게도,'pthread_cancel'은 라이브러리 코드에서 유일하게 깨끗한 방법으로 시스템 호출에서 차단 될 수있는 스레드를 인터럽트합니다. 다른 방법은 인터럽트 시그널 핸들러를 설치하고 모든 코드가'EINTR'을 다룰 준비가되어 있는지 확인하는 것이지만, 라이브러리 코드는 시그널 핸들링을 변경하거나 호출자에게'EINTR' 처리를 부과 할 권리가 있다고 가정 할 수 없습니다. –