CreateThread()、mingxing - 凯时娱乐

CreateThread()、mingxing

2019-02-13 10:19:49 | 作者: 易文 | 标签: 线程,函数,运转 | 浏览: 6795

操作系统中线程是非常重要的概念,所以关于线程的创立常常有些困扰人的内容。如同创立线程的函数许多,那么他们之间的有什么联络与差异呢?


首要,需求阐明的是这三个函数都与CreateThread。CreateThread函数是Windows的一个API函数。首要的作用是创立一个线程。_beginthreadex函数是C/C++运转库供给的函数,从 _beginthreadex函数的源代码,可以看出它的首要动作是:增加了一个名为ptd的_ptiddata的结构的处理,然后在调用CreateThread函数。_ptiddata是每个线程都具有自己的专用的数据结构。关于运用CreateThread替代_beginthreadex的成果以及或许呈现的问题在《Windows中心编程》上讲的清楚: “或许你想知道,假如调用CreateThread,而不是调用C/C++运转期库的_beginthreadex来创立新线程,将会发作什么状况。当一个线程调用要求_ptiddata结构的C / C + +运转期库函数时,将会发作下面的一些状况(大多数C / C + +运转期库函数都是线程安全函数,不需求该结构)。


首要, C / C + +运转期库函数企图(通过调用T l s G e t Va l u e )获取线程的数据块的地址。假如回来N U L L作为t i d d a t a块的地址,调用线程就不具有与该地址相关的_t i d d a t a块。这时,C / C + +运转期库函数就在现场为调用线程分配一个_t i d d a t a块,并对它进行初始化。然后该_t i d d a t a块(通过T l s S e t Va l u e)与线程相关联。此刻,只需线程在运转,该_t i d d a t a将与线程待在一同。这时,C / C + +运转期库函数就可以运用线程的_t i d d a t a块,并且将来被调用的一切C / C + +运转期函数也能运用_t i d d a t a块。 当然,这看来有些古怪,由于线程运转时简直没有任何妨碍。不过,实际上仍是存在一些问题。首要,假如线程运用C / C + +运转期库的s i g n a l函数,那么整个进程就会停止运转,由于结构化反常处理帧没有准备好。


第二,假如不是调用_ e n d t h r e a d e x来停止线程的运转,那么数据块就不会被吊销,内存走漏就会呈现(那么谁还为运用C r e a t e T h r e a d函数创立的线程来调用_ e n d t h r e a d e x呢?)。”关于上面所说的两个问题:我也是有疑问的:运用CreateThread创立线程后,用CloseHandle函数封闭相应的线程句柄,不会对_ptiddata结构进行开释吗? 别的在网上看到一些关于这三个函数的评论如下: 一直对这三个创立线程的办法都搞不清楚,不知道在什么状况下该用那种办法,下面是从网上摘抄的一些帖子:


1、不要在一个MFC程序中运用_beginthreadex()或CreateThread()。这句话的意思是由于AfxBeginThread()是MFC封装的发动线程的函数,里边包含了许多和MFC相关的发动信息,并且封装了一些常用的操作,运用起来也比较简洁。而用别的两个函数就需求程序员对类型,安全性查看进行更多的考虑!


2、用_beginthreadex()函数应该是最佳挑选,由于_beginthreadex()函数是CRun-timeLibrary中的函数,函数的参数和数据类型都是CRun-timeLibrary中的类型,这样在发动线程时就不需求进行Windows数据类型和CRun-timeLibrary中的数据类型之间的转化。减低了线程发动时的资源耗费和时刻的耗费!


3、在C程序中,简直都要用到new和delete,莫非只要运用_beginthreadex()?不,由于MFC也是C类库(只不过是Microsoft的C类库,不是规范的C类库),在MFC中也封装了new和delete两中运算符,所以用到new和delete的当地不一定非要运用_beginthreadex()函数,用其他两个函数都可以!其实在程序中运用上面的哪个函数并不是肯定的,书的作者只不过是提了一个更佳的调配办法,我在MFC程序中也常常运用_beginthreadex()和CreateThread()这两个函数,运转的作用也没有多大的差异,有的时分仅仅需求你额定的进行一些类型查看和其他的一些转化操作,其他没有其他不当! 创立线程只要一个办法是::CreateThread()。_beginthreadex()、AfxBeginThread()等内部都是调用这个函数的,由于操作系统只供给这一个接口C静态库比WINDOWS出来还早,就别提多线程了,所以他对多线程的支撑不是很好,但懊悔也来不急,但也不能怪人家。


C运转库_beginthreadex()。他通过一些处理后,再调用CreateThread()假如要强制完毕的话也最好用_endthreadex完毕,由于他也要一些处理。 总结上面的内容,当然《Windows中心编程》上面得说法是比较威望的。所以,在对线程的结构、运转还不是很了解的时分最好仍是依照书上的来。这样可以防止一些或许呈现的莫名美妙的过错,也省去的一些其他结构处理的考虑。当你清楚地知道线程的结构与运转机制,以及了解各个函数对CreateThread函数的封装的时分,大约那时分就可以使用自若了。

 

转载自:https://blog.csdn.net/whui890911/article/details/8712174

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表凯时娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章

阅读排行

  • 1

    第八章 装修形式环球

    形式,组件,结构
  • 2

    CreateThread()、mingxing

    线程,函数,运转
  • 3

    js 目标过错itjob

    目标,网站,上线
  • 4
  • 5
  • 6

    dom4j比如alibaba

    节点,特点,示例
  • 7

    没事瞎玩一下dongfang

    蒲公英,程序,代码
  • 8
  • 9
  • 10