当一个线程调用pthread_exit()
时,POSIX要求取消状态和类型设置为PTHREAD_CANCEL_DISABLE
和PTHREAD_CANCEL_DEFERRED
(XSH 2.9.5,在题词线程取消清理下处理程序)由libc实现。
从作为参数传递给pthread_create()
的函数返回的线程应该像调用pthread_exit()
一样。但是,对于main()
主题,这是不同的,从main()
返回的行为应该像调用exit()
一样。
我找不到任何将exit()
与禁用取消相关联的语言,或暗示与pthread_exit()
相同的效果。
那么,应该从main()
返回还是调用exit()
禁用线程取消?
答案 0 :(得分:2)
标准功能不允许具有超出指定范围的效果。 exit
未指定对取消状态或类型有任何影响,因此对于任何符合要求的实现,它都没有。您可以通过安装调用atexit
的{{1}}处理程序然后调用任何取消点来观察此情况。但请注意以下事项:
如果通过调用atexit()注册的函数无法返回,则不应调用其余的注册函数,并且不应完成exit()处理的其余部分。如果多次调用exit(),则行为未定义。
因此,如果pthread_cancel(pthread_self())
处理程序导致取消操作,atexit
将无法完成,但再次调用它是未定义的行为。这样的过程必须完全避免退出,使用exit
,或使自己通过信号异常终止。