如果我调用pthread_create()
创建一个线程,即使主进程已经退出,我怎样才能让这个线程保持活动状态?
7 回答
这不可能。进程由线程组成,线程不能单独存在。
但是,如果您的意思是“主线程已退出”而不是“主进程已退出”,那么请参阅下面的最后一个说明,以防 main() 退出而不调用 pthread_exit。在这种情况下,所有线程都被隐式终止。如果 main() 在终止前调用了 pthread_exit,那么只有主线程退出,其他创建的线程继续运行。
有几种方法可以终止线程:
- 线程从其启动例程正常返回。它的工作已经完成。
- 线程调用 pthread_exit 子例程——不管它的工作是否完成。
- 该线程被另一个线程通过 pthread_cancel 例程取消。
- 由于调用 exec() 或 exit() ,整个过程终止
- 如果 main() 先完成,而没有显式调用 pthread_exit
如果你分离线程,在最后一个分离的线程完成之前,进程实际上不会结束,但是只有分离的线程才会运行。
您可以使用 分离线程pthread_detach
。
但是,要使其正常工作,您必须退出主线程(运行main
函数的线程),使用pthread_exit
和不使用exit
或从其返回。
main
进程退出后不可能有一个活动的线程。但是使用pthread_exit(..)
而不是exit(..)
inside main(..)
,您可以等待其他线程退出。这将终止主线程,但其他线程将继续执行。
有关 的更多信息pthread_exit()
,请访问此链接。
即使主进程已经退出,也不可能让线程保持活动状态。由于线程是主进程的一部分并且它使用相同的资源,一旦主程序退出它也会释放它的资源。所以进程退出后线程不能存活。
线程在进程“下”运行。main()
代码在线程中运行。您在 main()(或其他线程)中创建的任何其他线程都在同一进程下运行。
应该可以让您的main()
线程退出而不等待加入当前在同一进程下运行的其他线程。但是,我主要使用 Windows 并且没有尝试在 *nix 系统中运行它。
如果这样做,请确保每个线程在退出之前释放其资源。
你可以做的是不退出 main()。在 main 中的处理结束时,就在您将退出的地方,只需输入以下内容:
int main(void) {
...
...
while (1) sleep(10);
return (0);
}
...或类似的东西。进程是其中产生的所有线程的容器,并且它必须存在才能使线程继续存在。让 main() 线程保持活动状态以便其他线程继续执行没有害处。