вызов pthread_cancel () в цикле показывает увеличение использования MEM - PullRequest
0 голосов
/ 26 сентября 2019

Я тестирую функциональность pthread_cancel() с моим тестовым кодом на C. Это не точный код, который я использую, а упрощенная форма для объяснения.

int main(argc, char *argvp[])
{
    while(1) {
        start_thread();
        sleep(5);
        end_thread();
    }
}

void my_thread(void *arg) 
{
     printf("in my thread\n");
     pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
     return 0;
}

void start_thread()
{
    pthread_create(&my_id, NULL, &my_thread, NULL);
}

void end_thread()
{
    pthread_cancel(my_id);
}

Если я выполняю ps aux на моеммашина, я вижу, что для моего вышеупомянутого процесса секция RSS всегда увеличивается. Но если я заменим pthread_cancel() на pthread_join(), RSS для моего процесса не увеличится.

Я не выделяю никакихресурс в моей ветке, поэтому кажется, что pthread_cancel() не очищает некоторые связанные с pthread вещи за кулисами?

Я знаю, pthread_cancel() убивает поток, потому что число моих потоков остается стабильным на уровне 2 (проверено с помощью top... основной процесс + my_thread).

Я просмотрел функции pthread_cleanup_pop / push, но они выглядят так, как будто они используются для очистки выделенной пользователем памяти.

Нужно ли использовать их каждый разс pthread_cancel()?

Редактировать: RSS увеличивается на 4 КБ каждый цикл за один раз.

1 Ответ

0 голосов
/ 26 сентября 2019

Вызов pthread_detach () после pthread_cancel () освободит ресурсы, которые удерживались / использовались самой pthread.

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

...