C 从main()返回或调用exit()是否应该禁用线程取消?

C 从main()返回或调用exit()是否应该禁用线程取消?,c,pthreads,posix,language-lawyer,C,Pthreads,Posix,Language Lawyer,当线程调用pthread\u exit()时,POSIX要求libc实现将取消状态和类型设置为pthread\u CANCEL\u DISABLE和pthread\u CANCEL\u DEFERRED(XSH 2.9.5,在epigraph线程取消清理处理程序下) 从作为参数传递给pthread\u create()的函数返回的线程的行为应该像调用pthread\u exit()一样。但是,这对于main()线程是不同的,从main()返回应该像调用exit()一样 我找不到任何语言将exit

当线程调用
pthread\u exit()
时,POSIX要求libc实现将取消状态和类型设置为
pthread\u CANCEL\u DISABLE
pthread\u CANCEL\u DEFERRED
(XSH 2.9.5,在epigraph线程取消清理处理程序下)

从作为参数传递给
pthread\u create()
的函数返回的线程的行为应该像调用
pthread\u exit()
一样。但是,这对于
main()
线程是不同的,从
main()
返回应该像调用
exit()
一样

我找不到任何语言将
exit()
链接到禁用取消,或暗示与
pthread\u exit()
具有相同的效果


那么,应该从
main()
返回还是调用
exit()
禁用线程取消

标准功能不允许产生超出规定范围的效果<代码>退出未指定对取消状态或类型有任何影响,因此对于任何符合条件的实现,它不会有任何影响。您可以通过安装调用
pthread\u cancel(pthread\u self())
然后调用任何取消点的
atexit
处理程序来观察这一点。但是,请注意以下几点:

如果通过调用atexit()注册的函数未能返回,则不应调用其余注册的函数,并且exit()处理的其余部分也不应完成。如果多次调用exit(),则行为未定义


因此,如果
atexit
处理程序导致执行取消操作,
exit
将不会完成,但再次调用它是未定义的行为。然后,这样的进程必须完全避免退出,使用退出,或通过信号导致自身异常终止。

如果操作系统加载程序加载的线程不符合POSIX,为什么会这样做?@MartinJames:huh??主线程是一个线程(大部分)像其他线程一样
main()
是从libc中的某个位置调用的。同样,libc负责从
main()
或调用
exit()
返回的线程。感谢您的快速响应!你认为GLYBC的退出调用TLS析构函数不符合吗?@ L3X:对不起,我误读了GLIMC的代码。tls析构函数只有在主线程通过longjmp退出时才会被调用,当它调用
pthread_exit()
或响应取消请求时才会被调用。正常返回不会通过代码块。哦,谢谢你的澄清。我应该检查一下自己:D