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);
}