|
넌블로킹 소켓은 쓰레드 안에서 사용하도록 만들어진 것이 아닙니다. 넌블로킹 소켓은 쓰레드를 쓰지 않으려고
할 때 사용하기 위한 것입니다. 따라서 VCL의 소켓 컴포넌트 내부적으로 그에 대한 대비가 안되어있을 수
있습니다.
구체적인 코드를 어떻게 쓰셨는지 모르기 때문에(소켓을 어디서 클로즈시켰는지 등) 구체적으로 어디서
문제가 생겼는지 확실히 답변할 수는 없겠습니다만...
쓰레드에서 넌블로킹 소켓을 썼을 때 문제가 될 수 있는 예를 들면, 쓰레드를 Terminate()할 때 소켓을 닫는
동작을 하는 타이밍을 잃어버릴 수 있을 것입니다. 넌블로킹 소켓은 내부적인 윈도우 핸들을 통해서 메시지를
받아 처리하는 구조이기 때문에 Terminate를 호출하는 시점에 소켓의 클로즈 등 마무리 처리가 안될 가능성이
충분히 있습니다.
그럼...
김영민 님이 쓰신 글 :
: Program에서 Thread를 10개정도 만들었습니다.
: 각 Thread 안에는 Socket을 Non-blocking으로 동작하게 햇습니다.
: 연결이 안되면(Active==false) 30초정도 이후에 다시 Open합니다.
: 그 결과치는 Main program으로 보내게 합니다.
:
: 여기서 한가지 문제가 있어서 질문드립니다.
: 처음 Thread를 10개만들면 각 Thread에서 통신을 연결할려고하고, 연결/비연결의 정보를 얻을 수 있습니다.
: 그런데, 이 상황에서 Threads를 전부 Terminate() 시켰습니다.
: 그리고 다시 만들었습니다. 여기까진 문제가 없는듯 한데요..
: 결론인즉, Program을 닫을려고 하거나, 혹은 진행중에 NULL에 접근한다는 Error가 나오는 군요.
: Debug에서 봐도 해당 Thread는 죽었는데..
: 혹시, Socket이 남아있어서 그런가요? 무슨 Buffer 같은곳에 뭔가가 아직 존재하는건가요?
: 어떻게 하면 Thread 죽일때, 안에서 생성한 Socket도 안전하게 종료하고 다시 Thread를 띄울 수 있을까요?
: 그럼.
:
: 수정>
: pthread->Suspend();
: pthread->Terminate();
: pthread->Resume();
: 식으로 연속으로 호출하니까.. 안전하게 죽는군요.. 왜그런지는 몰라도..*^^*
:
|