Я боролся с этим в течение долгого времени. Оглядываясь, я, похоже, не могу найти ответ. Я просто создаю два отдельных потока, а затем использую pthread_exit()
на обоих из них, но есть утечки время от времени.Pthreads утечка памяти, даже если используется правильно
И потому, что я знаю, что люди спрашивают меня:
- Да, я прочитал все другие вопросы, и нет никакого реального ответа
- отмечают нити, как
detached
- Я даю
enough time
для резьбы для инициализации и штампа - Я прочитал инструкцию для pthread_exit и правильно используется
- Он компилирует штрафа с
-Wall
Код:
int threads_keepalive = 1;
void* thread_do(void *arg){
while(threads_keepalive)
sleep(1);
pthread_exit(NULL);
}
int main(){
/* Make threads */
pthread_t* threads;
threads = malloc(2 * sizeof(pthread_t));
pthread_create(&threads[0], NULL, thread_do, NULL);
pthread_create(&threads[1], NULL, thread_do, NULL);
pthread_detach(threads[0]);
pthread_detach(threads[1]);
sleep(1); // MAKING SURE THREADS HAVE INITIALIZED
/* Kill threads */
threads_keepalive = 0;
sleep(5); // MAKING SURE THREADS HAVE UNBLOCKED
free(threads);
return 0;
}
Запуск этого кода, хотя это правильно (по крайней мере, в моих глазах), я получаю утечки памяти в случайные моменты. Я бегу те же испытания несколько раз с valgrind
ниже
> gcc test.c -pthread -o test && for i in {1..100}; do valgrind --leak-check=full --track-origins=yes ./test 2>&1 | grep frees; done
==4088== total heap usage: 8 allocs, 4 frees, 2,230 bytes allocated
==4211== total heap usage: 8 allocs, 4 frees, 2,230 bytes allocated
==4337== total heap usage: 8 allocs, 4 frees, 2,230 bytes allocated
==4463== total heap usage: 8 allocs, 4 frees, 2,230 bytes allocated
==4590== total heap usage: 8 allocs, 8 frees, 2,230 bytes allocated
==4717== total heap usage: 8 allocs, 8 frees, 2,230 bytes allocated
==4853== total heap usage: 8 allocs, 4 frees, 2,230 bytes allocated
==4981== total heap usage: 8 allocs, 8 frees, 2,230 bytes allocated
==5110== total heap usage: 8 allocs, 8 frees, 2,230 bytes allocated
==5239== total heap usage: 8 allocs, 8 frees, 2,230 bytes allocated
..
Что происходит ??
Обновление: Создание одного потока вместо двух, не показывает утечки памяти.
Ну, чтобы начать с, может быть, вы должны прочитать человека для pthread_create(), в частности, подпись thread_start(). –
Нет функции 'thread_start()'. WTF вы говорите? –
Это на страницах руководства. В вашем коде «thread_do()» должен принимать параметр void *. Я не говорю, что это, безусловно, повлияет на ваши результаты, но вы были настолько настойчивы, что вы проверили столько материала .. –