|
빈번하게 생성되고 파괴되는 Thread 안에서 TClientSocket 을 Create 시키면.
처음에는 별무리 없이 소켓을 잘 만들고 사용후 정상적으로 파괴됩니다.
일정 시간이 경과되고 나면 소켓 Create 시 오류가 나기 시작하고.
그 발생 간격이 점차 좁아지면서 너무 자주 오류가 납니다. 다행이 Create 시 Try 문을 사용하여
오류를 검출하고 Free 시겨주는 것으로 데드락까지 가는것을 막기는 하였으나
근본적인 해결방법은 없는가요?
사용환경 :
C++Builder 5.0 , FastMM , IsMultiThread = True , SetThreadAffinityMask(GetCurrentThread(), 1)
IBM XSeris 365 , Intel(R) Xeon(TM) MP CPU 2.0GHz 듀얼, 3.50GB RAM, 하이퍼쓰레딩 사용
소스구현부분...
main.cpp-------------------------------------
void __fastcall TMain::FormCreate(TObject *Sender)
{
SetThreadAffinityMask(GetCurrentThread(), 1);
IsMultiThread = True;
}
void __fastcall TMain::MakeThread(TObject *Sender)
{
ThreadMy *JobMy; //TThread 를 상속받아 만들었음...
try {
JobMy = new ThreadMy();
if (JobMy == NULL) {
ShowMessage(FormatDateTime("hh:mm:ss",Now()) + " -> " + Data + ", Thread Create Error!!!");
} else {
JobMy->OnTerminate = ThreadDone;
}
} catch(...) {
ShowMessage(FormatDateTime("hh:mm:ss",Now()) + " -> " + Data + ", Thread Create Error!!!");
}
}
ThreadMy.cpp-------------------------------------
__fastcall ThreadMy::ThreadMy() : TThread(False)
{
FreeOnTerminate = True;
FTerminate = false; //전역변수
try {
FSocket = new TClientSocket(Application);
FSocket->OnError = FSocketError;
FSocket->OnDisconnect = FSocketDisconnect;
FSocket->Address = "127.0.0.1";
FSocket->Port = 3000;
FSocket->ClientType = ctBlocking;
} catch(...) { FTerminate = true; }
}
void __fastcall ThreadMy::Execute()
{
if (!FTerminate) {
쓰레드안에서 할일들을 합니다..
}
try {
if (FSocket != NULL) FSocket->Free();
} catch(...) { }
}
|