在以下程序中return p
提供与pthread_exit(p)
相同的输出。那么为什么要使用pthread_exit()
?
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);
}
答案 0 :(得分:5)
pthread_exit()
用于主程序exit()
的线程。
您是否可以使用return
终止主程序?
我猜不会。这就是exit()
和pthread_exit()
存在的原因。
从线程的main函数返回执行对pthread_exit()
的隐式调用。无论您如何终止线程,都会调用该函数。它负责线程的清理。
但是如果函数foo()
调用函数bar()
而bar()
决定它必须终止该线程,那么调用pthread_exit()
比从{返回}更方便{1}}并检查bar()
中的返回值。当链中的呼叫数量增加时,foo()
的烦恼就会增加。
答案 1 :(得分:0)
如果您使用通过pthread_cleanup_push
安装的清理处理程序,则两者之间的区别很重要
在pthread_cleanup_push
联机帮助页中显示:
- 取消线程后,将弹出所有堆叠的清理处理程序,并以将它们推入堆栈的顺序相反的顺序执行。
- 当线程通过调用pthread_exit(3)终止时,所有清理处理程序均如前所述执行。 (如果线程通过执行从线程启动函数返回的操作而终止,则不会调用清理处理程序。)
因此,如果您安装了清理处理程序,则在使用return时将不会调用它们,但在使用pthread_exit
时将被调用。