2011-06-20 3 views
1

Я разрабатываю приложение на C в среде Linux. Я заметил, что следующий код утечки тонн памяти после того, как только сотни казней:Отдельно pthread_create() утечка памяти

do { 
    pthread_t    flushThread; 
    pthread_attr_t   attr; 
    logevent_thread_t  logThread = { Db , &do_curl }; 

    if ((pthread_attr_init (&attr) == 0) && 
     (pthread_attr_setdetachstate (&attr , PTHREAD_CREATE_DETACHED) == 0) ) { 
     pthread_create (&flushThread , &attr , (void*)FlushThread , (void*)&logThread); 
     pthread_attr_destroy (&attr); 
    } 
} while(1); 

Когда я начал с кодом, Я только использовал pthread_create(), но когда я заметил утечку, я начал google'd и искал StackOverflow и нашел следующие ссылки:

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

К сожалению, утечка все еще существует. У меня больше нет идей, и вы получите дальнейшие советы!

Спасибо!


@arrowdodger: Вызов pthread_detach() без установки каких-либо атрибутов также утечки. Я также пробовал с setdetach и pthread_detach() без успеха.

@ drhirsch: Я знаю, что это утечка, потому что, когда у меня это работает в течение 1 дня, я получаю панику ядра «Из памяти». Additionnaly, используя верхнюю часть, я могу видеть все больше и больше воспоминаний, посвященных моему процессу (но я понимаю, что лучший способ изменить это - использовать valgrind).

+0

Откуда вы знаете, что этот код утечки памяти? – hirschhornsalz

ответ

0

Что я читаю из ваших ссылок, так это то, что вы должны вызывать pthread_detach(), а не создавать его с атрибутом DETACHED.

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