繁体   English   中英

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

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

假设我有一个像这样的代码:

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()情况下终止进程也是安全的吗?

提前致谢。

如果你在谈论分配的内存,是的。 当进程退出所有分配给该进程的虚拟内存页面时,会返回到系统,这将清除进程中分配的所有内存。

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

简而言之,如果操作系统在进程后没有清理它是操作系统中的错误。 但我们都没有写错误的软件吗?

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

例如,如果您的进程与守护进程或窗口管理器之类的另一个进程进行通信并分配资源,那么在进程终止而不释放它们的情况下是否释放这些进程取决于实现。

我认为问题可以用另一种方式回答:pthreads不拥有任何资源,资源由流程拥有。 (pthread可能是资源的“保管人”,例如它具有malloc的内存,但它不是所有者。)当进程终止时,任何仍然运行的pthreads突然停止,然后通常的进程清理发生。

POSIX说(对于_Exit() ):

•通过调用_Exit()或_exit()终止的线程不应调用其取消清除处理程序或每线程数据析构函数。

对于exit() POSIX指定更多清理 - 特别是运行所有atexit()事物和刷新流等 - 在继续之前,就像_Exit() 请注意,这不会为任何pthread调用任何pthread取消清理 - 系统无法分辨任何pthread所处的状态,并且无法确定是否能够pthread_cancel()所有pthread,所以它唯一能做的就是是阻止他们全都死了。

我可以推荐SingleUNIX®规范(POSIX) - 就像任何标准一样,它不是一个简单的阅读,但值得了解。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM