C++如何判断线程是否执行完毕函数是由线程执行还是直接调用的?

多线程编程如何知道函数运行在哪个线程?
[问题点数:20分]
多线程编程如何知道函数运行在哪个线程?
[问题点数:20分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2013年12月 C/C++大版内专家分月排行榜第二2013年12月 Linux/Unix社区大版内专家分月排行榜第二2013年11月 C/C++大版内专家分月排行榜第二2013年10月 C/C++大版内专家分月排行榜第二
2013年12月 C/C++大版内专家分月排行榜第二2013年12月 Linux/Unix社区大版内专家分月排行榜第二2013年11月 C/C++大版内专家分月排行榜第二2013年10月 C/C++大版内专家分月排行榜第二
2015年9月 VC/MFC大版内专家分月排行榜第二2015年7月 硬件/嵌入开发大版内专家分月排行榜第二2014年5月 VC/MFC大版内专家分月排行榜第二2014年3月 VC/MFC大版内专家分月排行榜第二2013年10月 VB大版内专家分月排行榜第二2013年7月 VB大版内专家分月排行榜第二2012年5月 VB大版内专家分月排行榜第二2012年4月 VB大版内专家分月排行榜第二2012年2月 VB大版内专家分月排行榜第二2011年11月 VB大版内专家分月排行榜第二
2015年11月 VC/MFC大版内专家分月排行榜第三2015年6月 VC/MFC大版内专家分月排行榜第三2015年2月 VC/MFC大版内专家分月排行榜第三2014年1月 VC/MFC大版内专家分月排行榜第三2012年3月 VB大版内专家分月排行榜第三2011年12月 VB大版内专家分月排行榜第三2011年10月 VB大版内专家分月排行榜第三
2014年 总版技术专家分年内排行榜第二
2013年 总版技术专家分年内排行榜第三
2016年2月 C/C++大版内专家分月排行榜第三2016年1月 C/C++大版内专家分月排行榜第三
匿名用户不能发表回复!|C++中编写线程基础类,使用线程函数的方法 - 菜鸟基地 - 博客园
随笔 - 1, 文章 - 59, 评论 - 0, 引用 - 0
把成员函数作为线程函数,this指针会作为默认的参数被传进函数中,从而和线程函数参数(void*)不能匹配,不能通过编译。怎么解决呢?网上有一个解决办法,引用过来,自己记着。摘自:http://hi.chinaunix.net/?uid--action-viewspace-itemid-48886将线程函数作为静态函数,因为在C++中静态函数没有this指针(即在内存中静态函数和普通全局函数几乎没有什么区别),故可以匹配编译通过, 但是当线程函数要访问私有变量呢?可以访问到吗?答案是不可以!
解决方案: 将this指针作为参数传递给静态函数,这样可以通过该this指针访问所有的私有变量, 但是我要是还需要向静态函数中传递我自己需要的参数呢?
答案是:将this指针和需要的参数作为一个结构体一起传给静态函数,请看下面代码:
#include &iostream&#include ".h"
class A;struct ARG{&&&&&A* pT&&&&&};class A{&&&&public:&&&&&&&&A();&&&&&&&&~A();&&&&&&&&static void* thread(void* args);&&&&&&&&void&&excute();&&&&private:&&&&&&&&int iC
A::A(){&&&&iCount = 10;}A::~A(){
}void* A::thread(void* args){&&&&&ARG *arg = (ARG*)&&&&&A* pThis = arg-&pT&&&&&string var = arg-&&&&&&cout&&"传入进来的参数var: "&&var&&&&&&&cout&&"用static线程函数调用私有变量: "&&pThis-&iCount&&
void A::excute(){&&&&&&&&&&pthread_t thread_&&&&&ARG *arg = new ARG();&&&&&arg-&pThis =&&&&&arg-&var = "abc";&&&&&error = pthread_create(&thread_id, NULL, thread, (void*)arg);&&&&&if (error == 0)&&&&&{&&&&&&&&&cout&&"线程创建成功"&&&&&&&&&&&pthread_join(thread_id, NULL);&&&&&}}新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
白手起家, 积分 12, 距离下一级还需 188 积分
论坛徽章:0
例如有两个类的对象,分别是由两个线程来创建的。将对象A的指针传到对象B中,那么对象B可以通过A的指针来调用类A的公有函数吗?
我在Qt中试来,貌似程序异常退出。
腰缠万贯, 积分 9361, 距离下一级还需 639 积分
论坛徽章:14
Qt中的某些玩意儿是不可以跨线程调用的,只能通过信号和槽,但如果不用它那些玩意儿则是可以的
白手起家, 积分 12, 距离下一级还需 188 积分
论坛徽章:0
我原本以为可以的,在qt中试来就是不行。那就是应该是qt的问题了,它是用信号和槽来代替这种函数回调的。thanks~
北京盛拓优讯信息技术有限公司. 版权所有 京ICP备号 北京市公安局海淀分局网监中心备案编号:22
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处退出线程可以有四种方法:
1.线程函数的return返回(最好这样):
  其中用线程函数的return返回, 而终止线程是最安全的, 在线程函数return返回后, 会清理函数内申请的类对象, 即调用这些对象的析构函数. 然后会自动调用 _endthreadex()函数来清理 _beginthreadex(...)函数申请的资源(主要是创建的tiddata对象).
2.调用 _endthreadex()函数 或 ExitThread()函数(最好不要):
  如果使用这两种方法退出线程, 则不会执行线程函数的return语句, 所以就不会调用线程函数作用域内申请的类对象的析构函数, 会造成内存泄露.
  剩下两种是在程序设计中一定要避免的.
3.用同一个进程中的另一个线程调用 TerminateThread()函数(必须避免);
4.终止该线程所在的进程(绝对避免);
  但是要说_endthreadex完全没有用肯定是不对的,_endthreadex并不是一个过时的函数,正确的使用并不会带来问题。  比如在线程的主函数中,return是_endthreadex的一个良好替代,就像main函数里面return是exit()或ExitProccess()的良好替代一样,但是这不表示exit函数没用。比如线程调用了一个子函数,如果子函数决定退出线程,return是没用的,_endthreadex即可终结线程。  但是这个设计不好,因为可能造成LZ提出的资源泄漏。尤其考虑到后台线程终结后的资源泄漏比主线程的资源泄漏更要命(主线程退出后,进程就退出了,OS会清理一切资源,无所谓泄露不泄露,而子线程退出后主线程可能还会运行很久,并且可能有大量的同类型的子线程退出,会造成要命的泄露)  良好的设计还是返回线程的主函数,让threadproc来决定是不是要退出,从这个意义上说,_endthreadex没有必要。微软也指出,有些程序员就是要调用exit系列函数(ExitThread,ExitProccess等),没辙,只好提供了。
阅读(...) 评论()在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
(多核cpu的情况下) 比如我发起一个async_write函数, 这个函数调用后立马返回了, 继续向下执行, 不会造成阻塞,当这个写操作完成后, 操作系统来通知我, 写操作完成了. 然后执行回调函数. 那么, 是不是这个"写操作"的这个过程是由别的线程或者是什么东西来完成的? 单线程却异步的代码的背后是不是有一堆线程来辅助执行? 还有,我同是发起很多个异步函数后, 是不是一个异步函数对应一个线程? 还是这很多个异步函数只对应一定数目的线程(线程池?)?
如果是单核cpu 那又是怎么实现异步呢?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
首先CPU核心数和线程数并不是对应的,并不是说你是单核CPU就只能执行一个线程。线程是操作系统模拟出来的概念,通过系统的调度算法实现“并行”运行(实际上在单核核心中还是串行的)。
至于异步操作,当然是扔到另外一个线程里去执行啦。当然,你也可以在单一线程里模拟出异步的效果,但是这实际上就是在干操作系统干的事情。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
异步的背后一定有多线程的支持。
异步程序背后可能有一到多个线程支持。
单核也支持多线程。一段程序并不会一直不停执行,操作系统会运行调度,让这个程序(线程)跑一会儿,再让那个程序(线程)跑一会儿。由此支持多线程。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
异步程序的关键是非阻塞io,具体就是select函数以及linux上的epoll和mac上的kqueue,自己建一个事件循环,一旦有io动作就切换到其他任务执行,并不断扫描各个io任务的执行情况。
典型的异步应用例子是nginx,lighttpd,python 3.4中的asyncio库,nodejs。这几个都不是通过线程实现的,试想,如果用线程来实现,nginx如何能做到10万并发连接。
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。

我要回帖

更多关于 判断线程池是否执行完 的文章

 

随机推荐