C 当我们可以使用return时,为什么要使用pthread_exit()?

C 当我们可以使用return时,为什么要使用pthread_exit()?,c,unix,C,Unix,在下面的程序中,return p给出与pthread\u exit(p)相同的输出。那么为什么要使用pthread\u exit() pthread\u exit() 您能否始终使用return终止主程序? 我想不是。这就是存在exit()和pthread\u exit()的原因 从线程的主函数返回执行对pthread\u exit()的隐式调用。无论您如何终止线程,都会调用该函数。它负责线程的清理 但是如果函数foo()调用函数bar()并且bar()决定它必须终止线程,那么调用pthread

在下面的程序中,
return p
给出与
pthread\u exit(p)
相同的输出。那么为什么要使用
pthread\u exit()

pthread\u exit()

您能否始终使用
return
终止主程序? 我想不是。这就是存在
exit()
pthread\u exit()
的原因

从线程的主函数返回执行对
pthread\u exit()
的隐式调用。无论您如何终止线程,都会调用该函数。它负责线程的清理


但是如果函数
foo()
调用函数
bar()
并且
bar()
决定它必须终止线程,那么调用
pthread\u exit()
比从
bar()
返回并在
foo()
中检查返回值更方便。当链中的调用数增加时,
return
的烦恼也会增加。

如果您使用通过
pthread\u cleanup\u push安装的清理处理程序,这两者之间的区别很重要

pthread\u cleanup\u push
手册页中,它显示:

  • 当一个线程被取消时,所有堆叠的清理处理程序都会弹出并按与推送到堆栈上的顺序相反的顺序执行
  • 当一个线程通过调用pthread_exit(3)终止时,所有清理处理程序都会按照前一点所述执行。(如果线程通过执行线程开始函数的返回而终止,则不会调用清理处理程序。

  • 因此,如果安装了清理处理程序,如果使用return将不会调用它们,但是如果使用
    pthread\u exit

    将调用它们。该值可用于加入的线程(如果可加入),使用
    pthread\u cleanup\u push
    注册的任何处理程序都将弹出。请参阅另一个原因:假设启动线程。该线程调用您的一个函数,该函数调用另一个函数,但该函数由于不可恢复的错误而失败。您可以从该函数调用
    pthread_exit()。出于同样的原因,它与调用
    exit()
    的单线程程序没有太大区别,只是需要传递返回值指针。奇怪的是,它说:
    无论线程终止的方法是什么,都会执行任何已推送但尚未弹出的取消清理处理程序,任何现有线程特定数据的析构函数都会被执行。
    ,这让我怀疑这是否是一个令人遗憾的措辞,或者Linux与POSIX的区别。有人知道吗?
    void *foo(void *p){
        *((int *)p) += 1;
        pthread_exit(p);
    
    }
    
    int main()
    {
        pthread_t t;
        int i=9;
        int *j;
        pthread_create(&t,NULL, foo, &i);
        pthread_join(t,(void**)&j);
        printf("%d\n",*j);
    }