假设我有这样的代码:
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()
,因为我{ {1}}包含在tid
结构中。
现在我的问题是,操作系统终止进程后是否会破坏与my_resource
相关的资源?如果是的话,我该如何确保。
在不调用pthreads
的情况下终止流程也是安全的吗?
提前致谢。
答案 0 :(得分:4)
如果您正在谈论分配的内存,是的。当进程退出所有分配给该进程的虚拟内存页面时,会返回到系统,这将清除进程中分配的所有内存。
通常,操作系统应该在退出时清理与进程关联的所有资源。它将处理关闭文件句柄(可以包括套接字和RPC机制),擦除堆栈,以及清理任务的内核资源。
简短的回答,如果操作系统在进程后没有清理它是操作系统中的错误。但我们没有人写错误的软件吗?
答案 1 :(得分:0)
当进程终止时(例如,内存,套接字,文件句柄),操作系统会自动释放进程所需的所有“常规”资源。最重要的例外是共享内存,但如果它们不是由操作系统管理而是由其他进程管理,那么其他资源也可能会出现问题。
例如,如果您的进程与守护进程或窗口管理器之类的另一个进程进行通信并分配资源,那么在进程终止而不释放它们的情况下是否发布这些进程取决于实现。
答案 2 :(得分:0)
我认为问题可以用另一种方式回答:pthreads不拥有任何资源,资源由流程拥有。 (pthread可能是"托管人和资源,例如内存有malloc&ed;但它不是所有者。)当进程终止时,任何仍在运行的pthreads突然停止然后通常的过程清理发生。
POSIX说(对于_Exit()
):
•通过调用_Exit()或_exit()终止的线程不应调用其取消清理处理程序或每线程数据析构函数。
对于exit()
POSIX指定更多清理 - 特别是运行所有atexit()
事物和刷新流等 - 然后再继续进行_Exit()
。请注意,这不会为任何pthread调用任何pthread取消清理 - 系统无法分辨任何pthread所处的状态,并且无法确定是否能够pthread_cancel()
所有pthread,所以它唯一可以执行的操作,这是为了阻止他们全部死亡。
我可以推荐Single UNIX® Specification (POSIX) - 就像任何标准一样,它不是一个简单的阅读,但值得了解。