进程是否在退出时自动清理pthreads占用的资源?

Does the process automatically clean up the resources taken by pthreads upon exit

本文关键字:pthreads 资源 是否 退出 进程      更新时间:2023-10-16

假设我有如下代码:

void *my_thread(void *data)
{
    while (1) { }
}
void foo_init(struct my_resource *res)
{
    pthread_create(&res->tid, NULL, my_thread, res);
    /* Some init code */
}
void foo_exit(void)
{
    /* Some exit code */
}

场景是这样的。当进程初始化时,函数foo_init()被调用,并带有一个指向我分配的资源的指针(分配是由一些不受我控制的其他函数自动完成的)。在函数中,我创建了一个pthread,它在无限循环中运行。

过了一会儿,当进程即将终止时,函数foo_exit()被调用,但这次没有指向我的资源的指针,因此我无法调用pthread_join(),因为我的tid包含在my_resource结构中。

现在我的问题是,是否属于pthreads的资源在操作系统终止进程时被销毁?如果是,我怎样才能确定呢?

不调用pthread_join()终止进程是否安全?

如果你说的是分配内存,是的。当一个进程退出时,分配给该进程的所有虚拟内存页将返回给系统,这将清理进程内分配的所有内存。

通常,操作系统应该在退出时清理与进程相关的所有资源。它将处理关闭文件句柄(可以包括套接字和RPC机制),清除堆栈,并为任务清理内核资源。

简短的回答,如果操作系统在一个进程后没有清理,那就是操作系统的一个bug。但是没有人编写有bug的软件,对吧?

当进程终止时,操作系统会自动释放进程所需的所有"常规"资源(例如内存、套接字、文件句柄)。最重要的例外是共享内存,但如果其他资源不是由操作系统管理,而是由其他进程管理,则可能会出现问题。

例如,如果您的进程与守护进程或另一个进程(如窗口管理器)对话并分配资源,则在进程未释放它们而终止的情况下是否释放这些资源取决于实现。

我认为这个问题可以用另一种方式回答:pthreads不拥有任何资源,资源由进程拥有。(线程可能是资源的"保管人",比如它被malloc占用的内存,但它不是资源的所有者。)当进程终止时,所有仍在运行的pthread突然停止,然后进行常规的进程清理。

POSIX表示(for _Exit()):

•调用_Exit()或_Exit()终止的线程不能调用它们的取消清理处理程序或每个线程的数据析构函数。

对于exit(), POSIX指定了更多的清理——特别是运行所有atexit()的东西和刷新流等等——在执行_Exit()之前。请注意,这不会为任何pthread调用任何pthread取消清理——系统不能告诉任何pthread处于什么状态,也不能确保能够pthread_cancel()所有的pthread,所以它唯一能做的就是停止所有的pthread。

我可以推荐单一UNIX®规范(POSIX)——像任何标准一样,它不容易阅读,但值得了解。