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

时间:2015-12-15 20:15:30

标签: c pthreads posix language-lawyer

当一个线程调用pthread_exit()时,POSIX要求取消状态和类型设置为PTHREAD_CANCEL_DISABLEPTHREAD_CANCEL_DEFERRED(XSH 2.9.5,在题词线程取消清理下处理程序)由libc实现。

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

我找不到任何将exit()与禁用取消相关联的语言,或暗示与pthread_exit()相同的效果。

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

1 个答案:

答案 0 :(得分:2)

标准功能不允许具有超出指定范围的效果。 exit未指定对取消状态或类型有任何影响,因此对于任何符合要求的实现,它都没有。您可以通过安装调用atexit的{​​{1}}处理程序然后调用任何取消点来观察此情况。但请注意以下事项:

  

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

因此,如果pthread_cancel(pthread_self())处理程序导致取消操作,atexit将无法完成,但再次调用它是未定义的行为。这样的过程必须完全避免退出,使用exit,或使自己通过信号异常终止。