首页 > 代码库 > C++晋升之多线程五之揭秘多线程(如果可以,微软办公喝咖啡)
C++晋升之多线程五之揭秘多线程(如果可以,微软办公喝咖啡)
多线程前面已经写了四篇文章了,我也是通过一点点的接近两周的时间对多线程现在一点都不害怕了,这篇文章是对我之前对多线程的一些问题的补充,纠正
1.CreatThread()这是操作系统提供的、封装好的、创建线程的函数,我之前的认为是这个函数的功能是创建线程,这个函数的真正功能是向操作系统提交创建线程的申请(有的人说会说我在抠字眼,我不这么认为),因为这个函数是操作系统封装好的,内部的实现对于我们来说是黑灯瞎火的,所以当我们提交申请后操作系统是怎么创建线程的我们不知道,创建好线程需要的时间我们不知道,以至于第一篇文章中提到的多线程的一个特性,创建有不可预测性,是指创建好的时间不可预测,不是说会不会创建的不可预测
2.我也查了一些资料,说多线程很麻烦,因为它的这些不可预测性导致有时候得细心纠错,经过我这段时间的学习我觉得多线程方面出错主要还是集中在一个问题(创建线程的函数名字漏个字母的这些不算哦),就是多线程争夺共享资源的问题,或者说多线程运行的时机问题
举个例子说明吧:
前提:父类构造中有向操作系统提交创建线程的函数,子类有一个成员指针,子类构造中这个指针开空间接受一串字符串,线程回调函数中调用子类的函数,且函数中的功能为打印子类成员指针中接受的字符串,建子类对象
问题在哪呢--------------思考后我当时还是很快找到的,我们来理一下思路
思路:主线程建子类对象
主线程跳到子类构造的函数体外
主线程跳到父类构造的函数体中,主线程提交创建线程申请
(问题在这)如果操作系统这个人效率很慢呢不知道啥时候创建好子线程,主线程可是同步运行的,主线程跳到子类构造中给自己的成员指针开辟空间,(问题来了)如果前面的操作系统这个人效率很快,很快的就创建好了子线程,而子线程调用子类的函数,调用的时候主线程还没有给子类的成员指针开辟空间,这时候子线程打印报错没有初始化
--换种情况,子线程调用子类函数的时候主线程给子类成员指针开辟了空间,但没有给指针赋值,打印会是乱的
--换种情况,如果说操作系统那个人在看到我的创建线程申请的时候还在打盹,我主线程已经为子类成员指针开辟好了空间赋值成功,那子线程打印没有问题
3.上面的思路中我在理的时候更明确了什么叫做共享资源,之前我的认为是几个子线程能抢夺用到的资源,这些资源之前只是在主线程中建的全局,主线程没有用而已,我忽略了主线程也是线程啊,上面的例子里这个子类的成员指针就是个共享资源!
4.在2里还意识到一个问题大家有没有发现,我在理思路的过程中,一直强调主线程或者说是子线程,因为我刚刚出的问题发生的本质原因是多线程造成的问题,多线程就应该提到是哪个线程,以后我去面试的时候HR问到我类似的问题,我会给他说的清清楚楚明明白白
5.以后的多线程也许很复杂,但我一点现在不感觉怕(也许没见到初生牛犊不怕虎),我现在感觉线程是什么,不就是个函数吗,创建的怎么创建我去管了吗?我倒是想管的细点,如果我可以的话,估计我可以坐在微软的办公大楼喝咖啡了
(写完这篇文章很开心,多线程、socket、数据库是基本的,终于解决了一座大山,接下来的时间继续加油,向孙先生看起)
(PanPen120原创,如有建议,请留言)
C++晋升之多线程五之揭秘多线程(如果可以,微软办公喝咖啡)