pthread_create утечка памяти? - PullRequest
       28

pthread_create утечка памяти?

2 голосов
/ 02 сентября 2011

Всякий раз, когда я запускаю valgrind в своей программе, это говорит о том, что я, возможно, потерял память везде, где я вызываю pthread_create. Я пытался следовать указаниям на

Ошибка утечки памяти valgrind при использовании pthread_create http://gelorakan.wordpress.com/2007/11/26/pthead_create-valgrind-memory-leak-solved/

и другие различные сайты, которые Google дал мне, но ничего не помогло. До сих пор я пытался присоединиться к потокам, устанавливая pthread_attr_t в DETACHED, вызывая pthread_detach в каждом потоке и вызывая pthread_exit ().

пытается PTHREAD_CREATE_DETACHED -

pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

pthread_create(&c_udp_comm, &attr, udp_comm_thread, (void*)this);
pthread_create(&drive, &attr, driving_thread, (void*)this);
pthread_create(&update, &attr, update_server_thread(void*)this);

Я думаю, что я, возможно, закодировал это следующее, присоединившись неправильно ... Я иду https://computing.llnl.gov/tutorials/pthreads/ и они имеют все свои потоки в массиве, поэтому они просто для цикла. Но у меня нет их всех в массиве, поэтому я попытался просто изменить его на работу. Пожалуйста, скажите мне, если я сделал это неправильно.

void* status;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

pthread_create(&c_udp_comm, &attr, udp_comm_thread, (void*)this);
pthread_create(&drive, &attr, driving_thread, (void*)this);
pthread_create(&update, &attr, update_server_thread(void*)this);

pthread_join(c_udp_comm, &status);
pthread_join(drive, &status);
pthread_join(update, &status);

пытается pthread_detach -

pthread_create(&c_udp_comm, NULL, udp_comm_thread, (void*)this);
pthread_create(&drive, NULL, driving_thread, (void*)this);
pthread_create(&update, NULL, update_server_thread(void*)this);

pthread_detach(c_udp_comm);
pthread_detach(drive);
pthread_detach(update);

пытается pthread_exit -

pthread_create(&c_udp_comm, NULL, udp_comm_thread, (void*)this);
pthread_create(&drive, NULL, driving_thread, (void*)this);
pthread_create(&update, NULL, update_server_thread(void*)this);

pthread_exit(NULL);

Если кто-нибудь может помочь мне понять, почему ничего из этого не работает, я был бы очень признателен.

Ответы [ 2 ]

4 голосов
/ 02 сентября 2011

glibc не освобождает стеки потоков при выходе из потоков; он кэширует их для повторного использования и сокращает кэш только тогда, когда он становится огромным. Таким образом, он всегда «вытекает» из памяти.

1 голос
/ 02 сентября 2011

Вы можете доказать отсутствие утечки, взяв код, использующий pthread_join, и несколько раз повторив процесс создания / соединения.Вы увидите, что объем «утечки» памяти не меняется, доказывая, что на самом деле не было утечки памяти вообще.

...