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

时间:2016-04-03 06:50:46

标签: c unix

在以下程序中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);
}

2 个答案:

答案 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联机帮助页中显示:

  
      
  1. 取消线程后,将弹出所有堆叠的清理处理程序,并以将它们推入堆栈的顺序相反的顺序执行。
  2.   
  3. 当线程通过调用pthread_exit(3)终止时,所有清理处理程序均如前所述执行。 (如果线程通过执行从线程启动函数返回的操作而终止,则不会调用清理处理程序。)
  4.   

因此,如果您安装了清理处理程序,则在使用return时将不会调用它们,但在使用pthread_exit时将被调用。