2015-01-06 3 views
-4

Я боролся с этим в течение долгого времени. Оглядываясь, я, похоже, не могу найти ответ. Я просто создаю два отдельных потока, а затем использую pthread_exit() на обоих из них, но есть утечки время от времени.Pthreads утечка памяти, даже если используется правильно

И потому, что я знаю, что люди спрашивают меня:

  1. Да, я прочитал все другие вопросы, и нет никакого реального ответа
  2. отмечают нити, как detached
  3. Я даю enough time для резьбы для инициализации и штампа
  4. Я прочитал инструкцию для pthread_exit и правильно используется
  5. Он компилирует штрафа с -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 
.. 

Что происходит ??

Обновление: Создание одного потока вместо двух, не показывает утечки памяти.

+2

Ну, чтобы начать с, может быть, вы должны прочитать человека для pthread_create(), в частности, подпись thread_start(). –

+0

Нет функции 'thread_start()'. WTF вы говорите? –

+1

Это на страницах руководства. В вашем коде «thread_do()» должен принимать параметр void *. Я не говорю, что это, безусловно, повлияет на ваши результаты, но вы были настолько настойчивы, что вы проверили столько материала .. –

ответ

0

Название вашего вопроса неверно - вы не используете нити правильно. Но я не думаю, что утечка памяти связана с любым из ваших случаев неопределенного поведения. Это просто ложная «утечка», о которой сообщает valgrind из-за (предполагая, что вы используете систему Linux с glibc) внутренними элементами glibc. См эти вопросы, связанные с:

+0

lol, я уже догадался, что :) –

+0

Будет ли другой способ проверить утечку памяти? – Pithikos

Смежные вопросы