Я тестирую функциональность 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 КБ каждый цикл за один раз.