Zwalnianie użytych zasobów, zamykanie wątków - framework na WinSock

0

Witam :). Jestem na etapie dopieszczania mojego frameworka na WinSock i tu pojawił się mój problem. Mam sobie klasę CServer(singleton) która tworzy nowe wątki - 1 wątek oczekuje na klientów + nieznana ilość wątków(klientów). Moje pytanie brzmi, czy destruktor klasy CServer na 100% jest wywoływany podczas zamykania programu?


CServer* CServer::Get()
{
	static CServer srv;
	return &srv;
}

 

Tak tworze singleton, jeżeli to ma jakieś znaczenie. Kolejna sprawa to jak zakończyć wątki... czytałem, że nie należy używać TerminateThread(). Wątek oczekujący na klientów mógłby być zakończony jakoś siłowo, ale np w wątku klienta na początku tworzę obiekt klasy CPacket i w pętli do niego pobieram dane, dopiero za pętlą jest delete Packet;(pętla jest przerwana jak recv zwróci wartość <1, czyli przy rozłączeniu klienta, błędzie). Według mnie obiekt klasy CPacket nie zostaje zwalniany... Nie mam zbytnio pomysłu jak zrobić żeby program zaczekał aż wątki się pozamykają, pozwalniają zasoby. Liczę, że z mojego opisu da się coś zrozumieć :P. Każda sugestia, pomysł mile widziany! Z góry dzięki :)

0
  1. Destruktor woła się jak obiekt jest niszczony, nie kiedy "program się zamyka". Jak zabijesz program przez ctrl+c to destruktor się na przykład nie wywoła.
  2. TerminateThread() nie pozwala wątkowi dokończyć pracy a lepiej gdyby wątek miał szansę po sobie posprzątać, pozamykać pliki, sockety itd.
0

Źle się wyraziłem, wiem że destruktor jest wywoływany np przy delete obiekt;, ale jak to jest przy singletonach gdzie obiekt klasy jest statyczny? Zakładam, że piszę aplikację konsolową, używam w niej tego singletonu - naciskam krzyżyk i...? I nie wiem czy destruktor się wywołał czy nie. Trochę lamerski temat, ale nurtuje mnie ta kwestia :)

0

Krzyżyk zazwyczaj powoduje przerwanie głównej pętli programu (takiej, czy innej) i w konsekwencji wyjście z main. Po wyjściu z main wywoływane są destruktory obiektów statycznych, globalnych itd.

0

Ok, dzięki :). Hmm tylko ciągle rozkminiam co zrobić żeby wątki miały czas na swobodne zamknięcie i pozwalnianie zasobów... Dałbym pole bool'owskie do klasy i w wątku by było sprawdzane, ale czy to ma sens?

EDIT
Dzięki za odpowiedzi, a problem z wątkami udało mi się rozwiązać przez obsługę zdarzeń konsoli :)). Pozdro

1 użytkowników online, w tym zalogowanych: 0, gości: 1