Wolnostojące wątki i wyciek pamięci
Czy ktoś może mi wyjaśnić, dlaczego ten prosty kod przecieka pamięć?
Uważam, że ponieważ pthreads są tworzone z odłączonym stanem, ich zasoby powinny być uwalniane natychmiast po ich zakończeniu, ale tak nie jest.
Moje środowisko to Qt5.2.
#include <QCoreApplication>
#include <windows.h>
void *threadFunc( void *arg )
{
printf("#");
pthread_exit(NULL);
}
int main()
{
pthread_t thread;
pthread_attr_t attr;
while(1)
{
printf("\nStarting threads...\n");
for(int idx=0;idx<100;idx++)
{
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_create( &thread, &attr, &threadFunc, NULL);
pthread_attr_destroy ( &attr );
}
printf("\nSleeping 10 seconds...\n");
Sleep(10000);
}
}
AKTUALIZACJA:
Odkryłem, że jeśli dodam niewielkie opóźnienie 5 milisekund w środkufor
pętla wyciekuSPOSÓB wolniej:
for(int idx=0;idx<100;idx++)
{
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_create( &thread, &attr, &threadFunc, NULL);
pthread_attr_destroy ( &attr );
Sleep(5); /// <--- 5 MILLISECONDS DELAY ///
}
To mnie przeraża, czy ktoś mógłby mi powiedzieć, co się dzieje? Jak to niewielkie opóźnienie może spowodować tak znaczącą zmianę? (lub zmień zachowanie w jakikolwiek sposób)
Wszelkie porady byłyby bardzo mile widziane.
Dzięki.
UPDATE2:
Ten wyciek zaobserwowano na platformach Windows (W7 i XP), nie zaobserwowano wycieku na platformach Linux (dziękuję @MichaelGoren)