2010-04-13 5 views
0

별도의 스레드 ListenerThread에 원격 서버에서 브로드 캐스팅 한 정보를 수신하는 소켓이 있습니다. 이것은 내가 개발할 필요가있는 한 클래스의 생성자에서 생성됩니다.소켓이있는 별도의 스레드를 죽이는 경우

일단 별도의 스레드가 시작되면 기본 스레드에서 차단 기능을 피할 필요가 있습니다. 클래스의 소멸자를 호출하는 시점에서 리스너 스레드에 대한 조인을 수행 할 수 없으므로 수행 할 수있는 유일한 작업은 그것을 죽이는 것입니다.

내 질문은 :

, 스레드에 전달 함수에 의해 할당 된 네트워크 resoruces에 무슨 일
  1. ? 소켓이 제대로 닫혀 있습니까? 아니면 보류중인 것이 있습니까? (이것에 대해 가장 걱정)

  2. 이 절차는 충분히 빠릅니다. 즉 스레드가 즉시 중단되도록 스레드가 죽었습니까?

  3. 내가 ... 리눅스 함께 일하고 어떤 명령이나 어떤 내가 어떤 네트워크 자원이 보류 남아 있지 있는지 확인하기 위해 확인하실 수 있습니다 또는 뭔가 운영 체제

에 대한 잘못된 정말 감사합니다 당신의 도움이

감사에 대한 많은 MNSTN

참고 : 나는 C에서 부스트 : 스레드를 사용하고 ++

답변

2
  1. 네트워크 자원은 스레드가 아닌 프로세스에 속하므로 소켓은 여전히 ​​열려 있습니다.

  2. boost::thread에는 kill 메서드가 없습니다. 만 방해 할 수 있습니다. 효과는 즉시 이 아니며 OS 스케쥴러에 따라 다릅니다. 어떤 네트워크 자원 보고 들어

  3. 는 프로세스가 -p 옵션 lsofnetstat(8) 을 확인 보유하고 있습니다.

설명대로 블로킹 소켓에 대한 중지 신호 문제는 일반적으로 self-pipe trick으로 해결됩니다.

+0

감사합니다. Nikolai! PTHREAD를 사용하더라도 pthread_cancel 또는 pthread_kill 또는 다른 함수를 사용하여 동일한 문제가 발생했는지 확인할 수 있습니까? 동일한 자체 파이프 트릭은 OS의 네트워크 자원으로 인해 적용되어야합니다. 맞습니까? – user311906

+0

필자는 * must *를 말하지 않겠지 만 동일하게 작동 할 것입니다 ('boost :: thread'는 유닉스에서 PThreads로 구현됩니다.) –

2

스레드를 죽일 때 보유한 리소스를 확인할 수 없습니다. 예를 들어, 힙 뮤텍스를 보유하고있을 수 있습니다. 스레드를 죽이면 뮤텍스가 잠긴 상태로 유지되며 아무도 (프로세스에서) 동적 메모리를 할당 할 수 없게됩니다.

강제로보다 평화로운 합의를 통해 이러한 일을하는 것이 훨씬 좋습니다. 스레드에 더 이상 필요하지 않다는 신호를 보내는 방법을 추가하십시오. boost::condition 일 수 있습니다. 스레드는이 조건을 확인하고 신호를 받으면 중지합니다.

+0

HI ATZZ. 당신의 응답을 주셔서 감사합니다. 내 코드에서 실제로 모든 뮤텍스가 없어 .. 당신 boost :: thread :: boost :: thread()를 사용하여 스레드를 죽이는 것보다 여전히 boost :: condition을 사용하는 것이 더 좋습니다. – user311906

+0

boost :: thread가 비슷한 것을 가지고 있는지 확실하지 않지만, pthreads API는 pthread_atexit()를 스레드가 스레드를 관리 할 때 리소스를 해제하는 방법으로 지원합니다. pthread_atexit()은 스레드에 대한 "마지막 유언"과 유사하다고 생각하십시오. –

+0

@Chris Cleeland - 당신은 pthread_cleanup_push()를 의미합니까? 명시 적으로 제어하는 ​​자원을 도울 수 있지만, 사용하는 자원 (내재적으로 사용하는 라이브러리 구현) 또는 시스템 자원과 함게 사용되는 자원은 무엇입니까? – atzz

관련 문제