首页 > 其他分享 >pthread_exit 和 return 的区别

pthread_exit 和 return 的区别

时间:2023-08-14 11:24:56浏览次数:42  
标签:语句 return 函数 exit pthread 线程

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



标签:语句,return,函数,exit,pthread,线程
From: https://www.cnblogs.com/FBsharl/p/17628118.html

相关文章

  • 解决Mac 上码云gitee或者github出现The requested URL returned error: 403
    出现场景要把某个项目push到码云上,已经设置了仓库地址,在最后一步直接报错。adodeMacBook-Pro:yimabaoado$gitpush--set-upstreamoriginmasterremote:[session-774b45b9]Accessdeniedfatal:unabletoaccess'https://gitee.com/mzmilk/yimabao.git/':Therequested......
  • Jenkinsfile使用k8s agent构建失败:Container jnlp was terminated (Exit Code: 1, Rea
    问题描述Jenkinsfile使用k8sagent构建失败jenkins报错截图:查看pod app-system-23-wmx8b-5lnl2-lxvlr的jnlp容器日志:分析处理一般构建失败大都是jnlp容器问题。经以下日志分析发现jenkins主节点和slave节点的jdk版本不一致导致该提示JavaJDK版本不对:hudson/slaves/SlaveComputer......
  • SystemExit异常 sys.exit()​​函数
    这个错误是SystemExit,它是Python中的一个异常类。当调用sys.exit()函数时,会引发SystemExit异常,这个函数用于退出程序。在你的代码中,sys.exit(0)被调用,参数0表示正常退出程序。在这种情况下,fun_read()函数中的某个条件被满足,导致程序调用了sys.exit(0)来退出。这可能是为了在某些情......
  • Know Thy Complexities!
    https://www.bigocheatsheet.com/ KnowThyComplexities!Hithere! ThiswebpagecoversthespaceandtimeBig-OcomplexitiesofcommonalgorithmsusedinComputerScience. Whenpreparingfortechnicalinterviewsinthepast,Ifoundmyselfspendinghour......
  • Couldn't launch Python exit code 9009
    Couldn'tlaunchPythonexitcode9009startstable-diffusion-webui,发现,python环境没有,我本地其实是已经安装完毕的,后来发现是因为windows的应用商店的快捷键,当你CMD命令行输入python的时候,会自动跳转到应用商店,然后你就会发现,你的python环境没有了,所以,需要将应用商店......
  • 【Oracle】使用exit,return,continue跳出循环
    【Oracle】使用exit,return,continue跳出循环exit是结束循环,但还会继续执行程序包中其他的内容return则是直接中断整个程序continue的作用是终止本次循环,开始下一次循环exitloopselectcount(1)intop_numfromtable1cwherec.b='b'an......
  • MongoDB 位置查询报错 planner returned error: unable to find index for $geoNear q
     执行查询语句,使用 $nearSphere/***1千米=0.6213712英里15千米=9.3205679英里查询通过除以地球的大约赤道半径(3963.2英里)将距离转换为弧度。*①:如果是第一页,查询50公里内的老朋友店铺,*②:查询15公里内所以的置顶服务商家,然后根据分页参数来截取*③:0.0015678......
  • mysql突然断电,无法启动问题, redo log 无法恢复 mysqld启动不了 Plugin 'InnoDB' init
    环境:CentOS7.x、MySQL5.7其实造成这种问题的原因有很多种,但是不管是什么问题,最终的原因一般是redolog造成的问题。为什么说是redolog造成的呢,因为redolog对应的文件就是两个ib_logfile开头的文件:ib_logfile0、ib_logfile1;下面的问题都是和ib_logfile有关。MySQL......
  • JavaScript中的 "return await promise" 与 "return promise"
    原文地址:'returnawaitpromise'vs'returnpromise'inJavaScript原文作者:DmitriPavlutin译文出自:翻译计划当从异步功能中返回时,您可以等待该承诺得到解决,或者您可以直接返回它:returnawaitpromisereturnpromise:jsasyncfunctionfunc1(){constpromise=asyncOperat......
  • Lazada shoppe Get Lazada Product Details API Return Value Description
     lazada.item_getRequestParametersRequestParameters:num_iid=267690734&nation=co.thParameterDescription:num_iid:lazadacommodityID(IstheIDofthecorrespondingcountryanddifferentcountriescannotbecommon)nation:countryTheoptionalvaluesfo......