2010-05-13 2 views
0

일부 하드웨어와 소켓 통신을하는 응용 프로그램이 있습니다. 특정 하드웨어에 대해 제가 객체를 가지고 있고이 객체가 연결이 설정 될 때까지 특정 포트 번호에서 무한히 5001을 청취하는 스레드를 시작한다고 가정합니다.개체를 삭제하는 동안 스레드를 죽이는 중

이제이 obect를 삭제하면 어쨌든 포트 번호 5001에서 수신 대기중인 스레드가 무너질 수 있습니다.

같은 장치에 대한 새 개체가 만들어 질 때마다 문제가 발생하므로 이전 스레드가 파괴되지 않으므로 스레드 누수가 발생합니다.

+0

플랫폼에 따라 다르며 어떤 OS를 사용합니까? –

+0

Windows 및 winsock – ckv

답변

1

Windows에서 WaitForSingleObject 함수를 사용하면 스레드가 종료되었는지 여부를 확인할 수 있습니다 (스레드의 핸들을 인수로 전달할 수 있음). 그리고 아마도 스레드의 종료를 시작할 이벤트를 만들고 싶을 것입니다.

+0

스레드 핸들을 사용하여 스레드를 죽이거나 삭제할 수 있습니다. – ckv

+0

또한 스레드가 accept port 함수를 사용하여 특정 포트 번호에서 무한정 듣고 있기 때문에 안전하게 스레드를 종료 할 수있는 방법이 없습니다. – ckv

+0

당신은'TerminateThread' 함수를 사용하여 스레드를 죽일 수 있습니다. 그러나 이것은 극단적 인 조치입니다. –

1

이 경우 비 차단 소켓을 사용해야합니다. 소켓을 차단하는 경우, Accept()는 연결이있을 때까지 블록을 호출합니다. ioctlsocket을 사용하여 소켓을 비 블로킹하고 Accept() 호출에서 WSAEWOULDBLOCK 오류 코드를 확인할 수 있습니다. 물론 WaitForSingleObject를 사용하도록 무한 루프를 수정하십시오.

더 많은 정보 here

0

그 스레드 루프가 종료해야한다는 말을 변수를 설정 한 후 소켓에 일부 데이터를 전송 아마 가치. 그러면 소켓에서 데이터를 수신하고 깨어나고 종료하고 종료 할 시간을 찾습니다.

관련 문제