博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux下线程编程的注意到和推荐做法
阅读量:4055 次
发布时间:2019-05-25

本文共 1305 字,大约阅读时间需要 4 分钟。

来自:

几个误区及注意点:

 误区1: 分离
线程不能被cancel.
这是将pthread_join与pthread_cancel搞混了。
thread分离可以在创建时设定,也可以用pthread_detach()在创建后设定。
被设定成分离
线程后,表明它在退出thread时会自动回收资源。所以不需要pthread_join. 但分离thread完全可以接收pthread_cancel()来退出。
 
误区2:已经退出的thread,再去对它pthread_cancel()会出错。
不会出错,如果某thread已经退出,再向它发送pthread_cancel().不会出错。但会返回ESRCH。此值为3。
 ESRCH  No thread could be found corresponding to that specified by the given thread ID.
 
这里显示出:一个thread,不管自身return或pthread_exit(). 此thread都算停掉了。只是不分离thread需要使用pthread_join来回收资源而已。
 
 
注意点1:不管是否分离,主thread先于其它thread退出,都是不可控的。也就是说会不可预知错误。
所以,主thread不要使用return,exit等退出。 而是使用pthread_exit().
主thread使用pthread_exit(). 则会阻赛之,直到所有子thread退出后才退出。
 
 
推荐的做法:
常常有这样的需求,一个子thread既需要在某些事件发生时自己退出,也可能被主thread要求退出。
则可以做如下设计:
子thread自己退出时,使用pthread_exit().
其它thread要求它退出时,是用pthread_cancel(). pthread_join().
 
则当其它thread先要求它退出时,走正常途径,pthread_cancel()导致其退出。pthread_join()确保其退出并回收资源。
当其自动使用pthread_exit()退出时,最终主thread也会调用pthread_cancel(),则返回错误。但pthread_join()则确保回收资源。
 
 
pthread系列函数错误码:
大多数系统函数执行正确返回0。否则返回-1。错误码在errno中。所以可以使用perror()来显示错误。
但pthread系列函数却通过返回值传递error code. 并不向errno中写入错误码。所以不能使用perror()来查看错误原因。
 
可以使用strerror(pthread_rel) 来打印错误原因:
 
iRel_pthread = pthread_create(&mRtid, NULL, thread_Read_Data, this);
if(iRel_pthread != 0)
{
  std::cout <<"kDriver: Create Scan_Device thread Error." << strerror(iRel_pthread)  <<std::endl;
 }

转载地址:http://bvoci.baihongyu.com/

你可能感兴趣的文章
毕业生的来清醒一下
查看>>
EL第四节课回想
查看>>
一些界面标准规范
查看>>
不是人过的四天!
查看>>
Roller2.1的配置手册
查看>>
关于session的详细解释
查看>>
Just one month!
查看>>
Reading Design Patterns
查看>>
华为公司 java 面试题
查看>>
走好创业之路第一步——创业时机的选择与目标的设定
查看>>
软件项目计划如何编写
查看>>
10 Places You Must Use Ajax
查看>>
刷脸支付青蛙Pro打通微信卡包小程序
查看>>
Flutter 事件分发流程
查看>>
大数据分析需要什么技术架构?
查看>>
Java开发有必要转大数据吗?
查看>>
Scala对于大数据开发重要吗?Scala基础学习建议
查看>>
Java大数据方向:入行Java大数据值得吗
查看>>
转行大数据还是人工智能,哪个发展更好
查看>>
大数据工程师简历怎么写,更受到HR青睐?
查看>>