PDA

View Full Version : [C] dubbi sulla CreateThread()


misterx
19-07-2011, 17:30
vi risulta che la funzione CreateThread() abbia dei problemi di memory leak ?

E se affermativo, in quali circostanze?

grazie

banryu79
20-07-2011, 08:36
Ciao, non sono certo un'esperto ma la cosa mi ha incuriosito così ho cercato un po' sul web.
Ecco delle pagine interessanti:
- stackoverflow (http://stackoverflow.com/questions/331536/windows-threading-beginthread-vs-beginthreadex-vs-createthread-c)
- microsoft tchnical support (http://support.microsoft.com/kb/104641/en-us)
- gamedev.net (http://www.gamedev.net/topic/101055-createthread-and-memory-leaks/)
- codeguru.com (http://www.codeguru.com/forum/showthread.php?t=446140)

misterx
20-07-2011, 09:06
Ciao, non sono certo un'esperto ma la cosa mi ha incuriosito così ho cercato un po' sul web.
Ecco delle pagine interessanti:
- stackoverflow (http://stackoverflow.com/questions/331536/windows-threading-beginthread-vs-beginthreadex-vs-createthread-c)
- microsoft tchnical support (http://support.microsoft.com/kb/104641/en-us)
- gamedev.net (http://www.gamedev.net/topic/101055-createthread-and-memory-leaks/)
- codeguru.com (http://www.codeguru.com/forum/showthread.php?t=446140)

ciao e grazie,
stavo leggendo anche in merito alla thread-safety ma non è molto chiaro a quali funzioni ci si riferisce.



http://www.iac.rm.cnr.it/sisopii/winthreads.pdf

tuccio`
20-07-2011, 16:18
ma non si possono eliminare i messaggi qui? :<

starfred
20-07-2011, 19:34
vi risulta che la funzione CreateThread() abbia dei problemi di memory leak ?

E se affermativo, in quali circostanze?

grazie

Se ti riferisci alla pthread_create(..) no, non ha memory leak. In ogni caso ti consiglio l'uso di valgrind. Ottimo tool di debug.

WarDuck
21-07-2011, 08:26
vi risulta che la funzione CreateThread() abbia dei problemi di memory leak ?

E se affermativo, in quali circostanze?

grazie

Stiamo parlando di una funzione di libreria introdotta con Windows 2000, credo che se ci fossero stati casi eclatanti di memory leaks se ne sarebbero accorti, o loro, o molti sviluppatori prima di te.

Cos'è che ti porta a pensare una cosa del genere?

misterx
21-07-2011, 10:26
Stiamo parlando di una funzione di libreria introdotta con Windows 2000, credo che se ci fossero stati casi eclatanti di memory leaks se ne sarebbero accorti, o loro, o molti sviluppatori prima di te.

Cos'è che ti porta a pensare una cosa del genere?


me lo hanno segnalato ed ho postato anche un documento qualche post sopra

marco.r
21-07-2011, 10:37
me lo hanno segnalato ed ho postato anche un documento qualche post sopra

Quanti thread crei ?
Potrebbe trattarsi di memoria locale al thread non liberata...

WarDuck
21-07-2011, 10:59
me lo hanno segnalato ed ho postato anche un documento qualche post sopra

Dando una letta veloce mi è parso di vedere solo questo:

Un thread pu`o terminare un altro thread con la funzione:
BOOL TerminateThread(
HANDLE hThread,
DWORD dwExitCode);
ma questa tecnica `e fortemente scoraggiata (non vengono liberate
le risorse del thread, non vengono eseguiti i “completion
handler”...).

e questo:


i pthread permettono di “terminare” in maniera pulita un
altro thread (con la primitiva pthread cancel) mentre nel
caso di Win32, la terminazione, come detto, non esegue tutte
le operazioni di cleanup (ad esempio l’invocazione dei
completion handler).


Qui ulteriori informazioni sulla TerminateThread:
http://msdn.microsoft.com/en-us/library/ms686717%28v=vs.85%29.aspx

Inoltre c'è una nota in grassetto relativamente al resource leak, ma sembra essere rivolta a Windows 2000, xp e 2003 server.

In ogni caso come dice anche lì è sconsigliato usare questa funzione.

Quindi il memory leak semmai ci fosse è causato da una terminazione forzata di un thread dall'esterno.

Se tu crei un thread e gestisci all'interno del thread stesso la terminazione con la ExitThread, non c'è alcun memory leak.

misterx
21-07-2011, 15:29
quell'articolo dice anche che se non sei più che sicuri di stare usando API win32 potresti avere dei problemi: sinceramente ho qualche dubbio in quanto ho anche letto che la VCL che usa borland builder non è multithread e forse le sue funzioni non sono thread-safe

Spero siano menate senza senso le mie