Threads - Speicherproblem
-
Hi, ich nutzte folgenden Code, um einen Thread mehrfach aufzurufen:
(stark gekürzt)void WINAPI t() { while(1) { Sleep(100); } } int main(int argc, char* argv[]) { while(1) { Sleep(1000); DWORD ID; HANDLE h=CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)t,(LPVOID) 0, 0, &ID); Sleep(1000); bool b=TerminateThread(h,0); bool b2=CloseHandle(h); } }Das Problem ist, dass ich im Taskmanager sehe, dass immer mehr Speicher reserviert wird...
Dieser Speicher wird erst freigegeben, wenn ich das Programm beende.
Weiß jemand von euch einen Rat ?
-
Jo, http://msdn.microsoft.com/en-us/library/ms686717
MSDN schrieb:
TerminateThread Function
...
Windows Server 2003 and Windows XP/2000: The target thread's initial stack is not freed, causing a resource leak.-> TerminateThread() nur im Notfall nutzen
-
Aber ich verwende halt blocking sockets, daher bleibt mein Listen-Thread (läuft nur 1. Sekunde) am Ende bei "recvfrom" stecken.
Wie kann ich diesen Thread dann schließen ?
Soll ich eine Thread kill Flag setzen, die direkt nach "recvfrom" abgefragt wird ?
Oder doch lieber non-blocking sockets ?
-
Das hat mich auch immer gerärgert.
Ich glaube, die Lösung ist, sich selbst ein Paket zu schicken. Also send() nach 127.0.0.1 und schon kehrt recvfrom() zurück.Aber wenn du im Thread schon NACH recvfrom() bist, brauchst du doch kein Flag setzen. return 0 und der Thread beendet sich.
-
Asynchron empfangen:
http://msdn.microsoft.com/en-us/library/ms741540.aspx
http://msdn.microsoft.com/en-us/library/ms741576.aspxOder das Socket herunterfahren/schliessen, was zu einem Fehler bei
recvfromführt:
http://msdn.microsoft.com/en-us/library/ms740481.aspx
http://msdn.microsoft.com/en-us/library/ms737582.aspxGrüssli
-
Ich würde das dann mit
u_int i=1; ioctlsocket(Socket,FIONBIO,&i);machen
Ich habe aber gehört, dass diese nicht-blockierenden Sockets einige Nachteile haben...
Wobei die Verwendung viel einfacher wäre
Was würdet ihr mir empfehlen ? Ich verwende sonst halt für jeden Client einen extra Thread. Das mit "select" hab ich noch nicht so verstanden.