2012-01-05 98 views

回答

9

两个原因,我想起:pthread_exit

  1. 允许您从调用堆栈任何深度退出线程。

  2. Must be called on the main thread if the TLS keys for the main thread are to have their free functions called.这里还有:“已经推尚未杀出以相反的顺序被弹出,他们推,然后所有执行取消清理处理程序之后的任何取消清理处理程序已经执行,如果线程具有任何线程特定的数据,适当的析构函数将以未指定的顺序调用......当第一次调用main()的线程之外的线程从启动例程返回时,隐式调用pthread_exit()被用来创建它,函数的返回值作为线程的退出状态。“

+1

不同意。在这两种情况下,pthread_exit仍然可以被return替换。 – 2012-01-05 22:58:50

+3

对于#1,是的,但这样做可能不方便。对于#2,它不能。看到我发布的链接。我最近在真实世界中遇到了这个问题。 – 2012-01-05 23:00:57

+4

@Mengfei:如果你在'pthread_create()'启动的函数中,'pthread_exit()'只能被'return'替换。如果线程在函数调用堆栈中更深一些,那么'return'根本不会做同样的事情。 – 2012-01-06 05:18:58

3

如果你要调用了pthread_exit复制的接口,那么你也应该叫exit()复制的界面,因为你可以在任意点退出程序。当您遇到某种您无法继续的错误情况时,您可能需要致电pthread_exit()。或者,您也可以在线索内找到您要查找的任何值。

至于它是真实存在的,根据documentation

当比线程以外的线程中的main()首次调用返回从启动程序到了pthread_exit隐式调用()由这是用来创建它。该函数的返回值用作线程的退出状态。

所以,如果你从线程做了return <some pointer>,或者只是到了最后,pthread_exit()就会被调用。从main()退出也是一样,如果你return 0你实际上打电话给exit(0)。函数必须存在,否则内核将无法确定线程是否退出。

相关问题