pthread_exit 和 return 的区别

发布时间 2023-08-14 11:12:20作者: FBshark

转载自:《pthread_exit 和 return 的区别》

pthread_exit() 和 return 的区别
如果想在线程执行结束时返回指定的数据,除了用 pthread_exit() 函数外,还可以使用 return 语句。

修改《pthread_exit()函数》演示代码中,将第 8 行(调用 pthread_exit() )代码替换成如下语句:

return "我直接退出线程了!";

会发现程序的执行结果和之前的完全相同。这意味着当线程执行结束时,无论是采用 return 语句还是调用 pthread_exit() 函数,主线程中的 pthread_join() 函数都可以接收到线程的返回值。

那么,return 语句和 pthread_exit() 函数的区别是什么呢?
首先,return 语句和 pthread_exit() 函数的含义不同,return 的含义是返回,它不仅可以用于线程执行的函数,普通函数也可以使用;pthread_exit() 函数的含义是线程退出,它专门用于结束某个线程的执行。

在主线程(main() 函数)中,return 和 pthread_exit() 函数的区别最明显。举个例子:

 1 #include <stdio.h>
 2 #include <pthread.h>
 3 #include <unistd.h>
 4 
 5 void *ThreadFun(void *arg)
 6 {
 7     sleep(5);//等待一段时间
 8     printf("你好,ThreadFun!\n");
 9 }
10 
11 int main()
12 {
13     int res;
14     pthread_t myThread;
15      
16     res = pthread_create(&myThread, NULL, ThreadFun, NULL);
17     if (res != 0) 
18     {
19         printf("线程创建失败");
20         return 0;
21     }
22 
23     printf("我是主线程最后的一个打印语句\n");
24 
25     return 0;
26 }

编译、执行此程序,输出结果为:

我是主线程最后的一个打印语句

通过执行结果可以看到,主线程正常执行结束,myThread 线程并没有输出指定的数据。原因很简单,主线程执行速度很快,主线程最后执行的 return 语句不仅会终止主线程执行,还会终止其它子线程执行。也就是说,myThread 线程还没有执行输出语句就被终止了。

将上面程序中,main() 函数中的return 0;用如下语句替换:

pthread_exit(NULL);

重新编译、执行程序,运行结果为:

我是主线程最后的一个打印语句
你好,ThreadFun!

 

总结

对比上面两个执行结果,我们可以得出的结论是:

  • pthread_exit() 函数只会终止当前线程,不会影响进程中其它线程的执行(但主线程中调用 return 会结束整个进程)
  • 此外,pthread_exit() 可以自动调用线程清理程序(本质是一个由 pthread_cleanup_push() 指定的自定义函数),return 则不具备这个能力。

总之在实际场景中,如果想终止某个子线程执行,强烈建议大家使用 pthread_exit() 函数。终止主线程时,return 和 pthread_exit() 函数发挥的功能不同,可以根据需要自行选择。