2010-01-18 2 views

답변

50

먼저 가게 스레드 ID

pthread_create(&thr, ...) 

는 나중에 그러나

pthread_cancel(thr) 

이 아닌 권장 프로그래밍 연습 불러! 실행을 중지해야하는 스레드와 통신하려면 세마포 또는 메시지와 같은 스레드 간 통신 메커니즘을 사용하는 것이 좋습니다.

pthread_kill (...)은 실제로 수신 스레드를 종료하지 않고 대신 신호를 전달하며 신호 처리기와 신호 처리기에 따라 다릅니다.

+4

pthread_cancel, btw의 문제는 사용하는 경우 취소 된 스레드에서 실행중인 코드가 취소 지점을 이해하고 (a) 충분히 자주 취소되어 실제로 취소 된 코드인지 확인해야한다는 것입니다 (b) 이러한 일이 발생하면 자원이 누출되지 않습니다. 이것은 다소 까다 롭습니다. 반면에 메시지를 사용하면 스레드가 종료 될 때 정확히 코드에서 명확하게 명시됩니다. –

+11

@Steve : 유감스럽게도,'pthread_cancel'은 라이브러리 코드에서 유일하게 깨끗한 방법으로 시스템 호출에서 차단 될 수있는 스레드를 인터럽트합니다. 다른 방법은 인터럽트 시그널 핸들러를 설치하고 모든 코드가'EINTR'을 다룰 준비가되어 있는지 확인하는 것이지만, 라이브러리 코드는 시그널 핸들링을 변경하거나 호출자에게'EINTR' 처리를 부과 할 권리가 있다고 가정 할 수 없습니다. –

2

pthread_kill() 기능을 살펴보십시오.

+2

이것은 어떤 스레드도 죽이지 않으며 단지 신호 만 보냅니다. – alk

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) 

이렇게하면 스레드가 종료됩니다.