Speicher für Thread im Thread freigeben!
-
hallo windows profis, ist das so ok oder gibts dann löcher im ram?
struct thread_paramaeter { HANDLE h; }; DWORD WINAPI threadfunction(LPVOID lpParam) { // some stuff that fuction does... CloseHandle (((struct thread_paramaeter*)lpParam)->h ); free(lpParam); } void threadstarter() { struct thread_paramaeter* p = malloc(sizeof(*p)); p->h = CreateThread(NULL, 0, threadfunction, p, 0, NULL); }
-
Das darfst Du so nicht machen...
Das kann sich zeitlich "überholen", dabei kann es zu zwei Effekten kommen:
1. Das "p->h" ist noch gar nicht zugewiesen, wenn Du das "CloseHandle" auffrust
und/oder
2. Das "free" wird aufgerufen und erst dann erfolgt die Zuweisung von "p->h", was dann zu einem Absturz führt.Auch interessiert doch der Thread sich nicht für das Handle. Das sollte außerhab des Threads geschlossen werden.
Was willst Du eigentlich machen?
-
Im virtuelen speicher meinst du wohl. denm du kannst nicht direkt auf das ram zugreifen im user mod.
-
Jochen Kalmbach schrieb:
Das darfst Du so nicht machen...
ja, nach nochmaligem überdenken sehe ich ein, du hast recht.
Jochen Kalmbach schrieb:
Was willst Du eigentlich machen?
ich wollte mir arbeit sparen
aber nagut, dann rufe ich free und CloseHandle doch lieber in threadstarter auf.
dann muss ich eben noch ein WaitForSigleObject zwischenschalten.
danke für deine antwort.
-
Das "free" kannst Du gerne im Thread machen; nur das CloseHandle macht dort keinen Sinn..
-
oh mann, jetzt weiß ich wieder was ich wollte!
ich kann nicht auf den thread warten, weil das programm sonst hakt.
WaitForSingleObject fällt also schon mal flach. dann brauch ich wohl noch nen extra thread, der ständig handles freigibt
ah, ich sehe gerade _beginthread schließt sich selbt, das ist was für mich!
-
Ein oft verwendetes Muster ist auch den Thread suspended zu starten, danach die "Vorbereitungen" abzuschliessen, und dann den Thread zu "resumen".
Wobei es wirklich meist nicht notwendig ist dem Thread sein eigenes Handle bekanntzugeben.ps: du kannst das Handle auch sofort freigeben. Der Thread bleibt davon unberührt und läuft ganz normal weiter.
-
hustbaer schrieb:
ps: du kannst das Handle auch sofort freigeben. Der Thread bleibt davon unberührt und läuft ganz normal weiter.
ah! okay, das wäre auch noch eine möglichkeit.
ich danke dir für den tipp!