转载自:《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() 函数发挥的功能不同,可以根据需要自行选择。