2014-07-16 5 views
0

공유 객체를로드하고 별도의 스레드에서 메소드를 실행하는 C++ 프로젝트에서 작업 중입니다. 이 스레드가 아직 종료되지 않은 경우 x 초 후에 모든 스레드를 닫는 것이 시스템의 요구 사항입니다. 어떤 스레드가 닫혔는지 추적 할 수는 있지만 아직 끝나지 않은 스레드를 죽이는 가장 좋은 방법은 무엇입니까?xsecconds 후에 실행중인 스레드를 죽이는 가장 좋은 방법은 무엇입니까?

사이드 노트 - Pthread_cancel이 세그멘테이션 오류를 일으키고 있습니다.

+0

스레드 자체가 알람을 발생 시켜서 죽이는 것이 좋습니까? 아니면 외부 스레드/프로세스가 그것을해야합니까? – wallyk

+0

이 세분화 오류가 발생한 위치와 같은 샘플 코드가 있습니까? – localhost

+0

누구나 할 수 있습니다. 나는 지금 경보를 울리려고 노력하고있다. 알람이 트리거되고 있지만 pthread_exit (NULL)을 호출하면 알 수 있습니다. 아무것도 일어나지 않고있다. –

답변

3

할 수 없습니다. 프로세스 컨텍스트를 손상시키지 않고 협력없이 스레드를 취소 할 수 없습니다.

스레드는 그런 종류의 격리를 제공하지 않습니다. 그들은 단지하지 않습니다. 스레드가 실패하면 프로세스가 실패합니다. 신뢰할 수 없거나 신뢰할 수없는 코드를 자체 프로세스 또는 가상 시스템 등에 포함해야합니다. 스레드는 완전히 투과성이 있습니다. 스레드가 수행하는 가장 일반적인 것들의

하나는 이것이다 :

  1. 획득 잠금.

  2. (잠금으로 보호되는) 일부 불변 조건을 깨십시오.

  3. 이러한 불변 값을 복원하십시오.

  4. 잠금을 해제하십시오.

이제 '스레드가 2 단계를 완료되었지만 (즉, 깨진 불변가 발생하는 잠금을 획득하기 위해 다음 스레드를 야기하기 때문에) 당신은 잠금을 해제 할 수없는 3 단계하지 않은 경우 상상을 수행 할 수 있습니다 잠금을 유지 한 상태로 두십시오 (이는 다음 스레드가 잠금을 획득하여 영원히 기다리게하기 때문입니다). 그래서 프로세스 컨텍스트는 그 시점에서 파괴 될 것입니다.

불변량을 복원하려면 스레드의 협조가 필요합니다.

+0

C에서 + + WaitForSingleObject 트릭을 못해? 단지 호기심. – Maddy

+3

@Maddy 그게 아무것도 취소하지 않습니다, 그냥 기다립니다. –

+0

나는 이런 식으로 생각했다. 'HANDLE myThread = CreateThread (0, 0, 할 일, NULL, 0, 0); WaitForSingleObject (myThread, 4000); ' – Maddy

0

은 내가 라인을 따라 뭔가가 여기 제안 제안 :

짧은에서

Run and break an infinite loop using two threads

, 당신의 스레드가 너무 자주 매를 확인하기 위해 필요하다는 종료 조건을 설정합니다. 설정되어 있으면 반환해야합니다. 모든 스레드가 함께 죽어야하는 경우에는 하나의 원자 만 필요합니다.

+0

스레드는 공유 객체에 의해로드되므로 응용 프로그램은이를 강제 할 수 없습니다. –

관련 문제