pthread_detach: unerwartetes verhalten bei ressourcen-verwaltung
-
pthread_detach verändert das verhalten bei unten stehendem programm auf komische art und weise.
#include <pthread.h> #include <cstdlib> void* memory = NULL; void* fun(void*) { //pthread_detach( pthread_self() ); free(memory); return NULL; } int main() { memory = malloc(1); pthread_t tid = 0; pthread_create(&tid, NULL, &fun, NULL); free(memory); pthread_join(tid, NULL); }
wenn ich das programm ohne pthread_detach() ausführe, stürzt das programm wie erwartet ab, weil ich zweimal free() auf dasselbe ziel ausführe. wenn ich hingegen pthread_detach() aufrufe (aber nicht pthread_join), passiert nichts (auch nicht mit MALLOC_CHECK_=1) und valgrind sagt nur, dass "vielleicht" speicher verloren gegangen ist.
dieses verhalten kann ich mir nicht erklären. was passiert denn mit dem speicher? das programm verhält sich wie nach einem fork-aufruf!system: diy linux, glibc 2.4, g++ 4.1.2
mfg
-
benutzer_ schrieb:
dieses verhalten kann ich mir nicht erklären. was passiert denn mit dem speicher? das programm verhält sich wie nach einem fork-aufruf!
Nein. Tut es nicht. Du hast nur "glück", dass dein Programm nicht abstürzt. Was du da machst, ist absolut verboten.
-
Evaluiere mal den Rückgabewert von phtread_join. Ich denke, dass es da einen Fehler gibt und das Program beendet sich, bevor ein double free passieren kann.