Отделенный pthread_create () утечки памяти - PullRequest
1 голос
/ 20 июня 2011

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

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 и нашел следующие URL:

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

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

Спасибо!


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

@ drhirsch: Я знаю, что он протекает, потому что, когда он запускается в течение 1 дня, у меня возникает паника ядра "Out Of Memory". Кроме того, используя top, я вижу все больше и больше воспоминаний, посвященных моему процессу (но я понимаю, что лучший способ контролировать это - использовать valgrind).

1 Ответ

0 голосов
/ 20 июня 2011

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

...