【发布时间】:2019-09-26 14:07:29
【问题描述】:
我正在用我在 C 中的测试代码测试pthread_cancel() 功能。这不是我使用的确切代码,而是用于解释的简化形式。
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_join() 替换pthread_cancel(),我的进程的RSS 不会增加。
我没有在我的线程中分配任何资源,所以看起来pthread_cancel() 没有在幕后清理一些与 pthread 相关的东西?
我知道pthread_cancel() 正在杀死线程,因为我的线程数稳定在 2(检查顶部 ... 主进程 + my_thread)。
我查看了 pthread_cleanup_pop/push 函数,但它们看起来像是用于清理用户分配的内存。
我每次都需要使用pthread_cancel()吗?
编辑:RSS 每次循环增加 4kBytes。
【问题讨论】:
-
如果你没有加入死线程,那么,是的,内存使用量将不断增加,因为与该线程相关的资源没有被释放......(
pthread_cancel()很少是好主意;通知您的线程它们需要停止,以便它们可以优雅地停止,然后加入它们。) -
我在线程中有一个阻塞的 curl 调用。如果我想终止线程,我不能在线程被阻塞时调用 join 。我认为 aync pthread_cancel 可以完成这项工作。
-
不要为阻塞函数创建多个线程。
-
这会导致更多的内存泄漏,因为 curl 的东西没有被清理掉......我想下一个问题是,如果它们需要被中断,你为什么要使用阻塞 curl 请求。使用它的非阻塞增量 API。
-
不幸的是,我坚持使用阻塞 curl 而不是 multi_curl 的当前实现。在 pthread_cancel() 之后调用 curl 句柄清理。
标签: c linux memory-leaks pthreads