当线程调用pthread_exit()时,POSIX需要由libc实现将取消状态和类型设置为PTHREAD_CANCEL_DISABLE和PTHREAD_CANCEL_DEFERRED (XSH2.9.5,在附则线程取消清理处理程序下)。
从作为参数传递给pthread_create()的函数返回的线程的行为应该像调用pthread_exit()一样。但是,对于main()线程来说,这是不同的,从main()返回应该像调用exit()一样。
我找不到任何语言将exit()链接到禁用取消,或暗示与pthread_exit()相同的效果。
因此,应该从main()返回还是调用exit()禁用线程取消?
发布于 2015-12-16 20:05:11
不允许标准函数产生超出规定的效果。不指定exit对取消状态或类型有任何影响,因此对于任何符合的实现,它都不会。您可以通过安装调用pthread_cancel(pthread_self())的atexit处理程序来观察这一点,然后调用任何取消点。然而,要注意以下几点:
如果通过调用atexit()注册的函数未能返回,则不应调用其余的已注册函数,其馀的exit()处理不应完成。如果不止一次调用exit(),则未定义该行为。
因此,如果atexit处理程序导致取消操作,exit将不会完成,但是再次调用它是未定义的行为。这样的过程必须完全避免退出,使用_exit,或通过信号导致自身异常终止。
https://stackoverflow.com/questions/34298565
复制相似问题