• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            yehao's Blog

            CreateThread()、_beginthreadex()及、AfxBeginThread()函數(shù)的討論

            操作系統(tǒng)中線程是非常重要的概念,所以關(guān)于線程的創(chuàng)建常常有些困擾人的內(nèi)容。好像創(chuàng)建線程的函數(shù)很多,那么他們之間的有什么聯(lián)系與區(qū)別呢?正如題目給出的三個(gè)函數(shù)。今天看了看Windows核心編程,再找了一些網(wǎng)上的資料,在此想說(shuō)說(shuō)這些函數(shù)之間的關(guān)系和區(qū)別。如有不正確的地方,請(qǐng)各位不吝賜教。

                  首先,需要說(shuō)明的是這三個(gè)函數(shù)都與CreateThread。CreateThread函數(shù)是Windows的一個(gè)API函數(shù),其具體的使用方法在 MSDN和《Windows核心編程》上都有詳細(xì)介紹。主要的作用是創(chuàng)建一個(gè)線程。_beginthreadex函數(shù)是C/C++運(yùn)行庫(kù)提供的函數(shù),從 _beginthreadex函數(shù)的源代碼,可以看出它的主要?jiǎng)幼魇牵涸黾恿艘粋€(gè)名為ptd的_ptiddata的結(jié)構(gòu)的處理,然后在調(diào)用CreateThread函數(shù)。_ptiddata是每個(gè)線程都擁有自己的專(zhuān)用的數(shù)據(jù)結(jié)構(gòu)。關(guān)于使用CreateThread代替_beginthreadex的結(jié)果以及可能出現(xiàn)的問(wèn)題在《Windows核心編程》上講的很清楚: “也許你想知道,如果調(diào)用CreateThread,而不是調(diào)用C/C++運(yùn)行期庫(kù)的_beginthreadex來(lái)創(chuàng)建新線程,將會(huì)發(fā)生什么情況。當(dāng)一個(gè)線程調(diào)用要求_ptiddata結(jié)構(gòu)的C / C + +運(yùn)行期庫(kù)函數(shù)時(shí),將會(huì)發(fā)生下面的一些情況(大多數(shù)C / C + +運(yùn)行期庫(kù)函數(shù)都是線程安全函數(shù),不需要該結(jié)構(gòu))。

                   首先, C / C + +運(yùn)行期庫(kù)函數(shù)試圖(通過(guò)調(diào)用T l s G e t Va l u e )獲取線程的數(shù)據(jù)塊的地址。如果返回N U L L作為t i d d a t a塊的地址,調(diào)用線程就不擁有與該地址相關(guān)的_t i d d a t a塊。這時(shí),C / C + +運(yùn)行期庫(kù)函數(shù)就在現(xiàn)場(chǎng)為調(diào)用線程分配一個(gè)_t i d d a t a塊,并對(duì)它進(jìn)行初始化。然后該_t i d d a t a塊(通過(guò)T l s S e t Va l u e)與線程相關(guān)聯(lián)。此時(shí),只要線程在運(yùn)行,該_t i d d a t a將與線程待在一起。這時(shí),C / C + +運(yùn)行期庫(kù)函數(shù)就可以使用線程的_t i d d a t a塊,而且將來(lái)被調(diào)用的所有C / C + +運(yùn)行期函數(shù)也能使用_t i d d a t a塊。當(dāng)然,這看來(lái)有些奇怪,因?yàn)榫€程運(yùn)行時(shí)幾乎沒(méi)有任何障礙。不過(guò),實(shí)際上還是存在一些問(wèn)題。首先,如果線程使用C / C + +運(yùn)行期庫(kù)的s i g n a l函數(shù),那么整個(gè)進(jìn)程就會(huì)終止運(yùn)行,因?yàn)榻Y(jié)構(gòu)化異常處理幀尚未準(zhǔn)備好。

                   第二,如果不是調(diào)用_ e n d t h r e a d e x來(lái)終止線程的運(yùn)行,那么數(shù)據(jù)塊就不會(huì)被撤消,內(nèi)存泄漏就會(huì)出現(xiàn)(那么誰(shuí)還為使用C r e a t e T h r e a d函數(shù)創(chuàng)建的線程來(lái)調(diào)用_ e n d t h r e a d e x呢?)。”對(duì)于上面所說(shuō)的兩個(gè)問(wèn)題:我也是有疑問(wèn)的:使用CreateThread創(chuàng)建線程后,用CloseHandle函數(shù)關(guān)閉相應(yīng)的線程句柄,不會(huì)對(duì)_ptiddata結(jié)構(gòu)進(jìn)行釋放嗎?另外在網(wǎng)上看到一些關(guān)于這三個(gè)函數(shù)的討論如下: 一直對(duì)這三個(gè)創(chuàng)建線程的方法都搞不清楚,不知道在什么情況下該用那種方法,下面是從網(wǎng)上摘錄的一些帖子:

                   1、不要在一個(gè)MFC程序中使用_beginthreadex()或CreateThread()。這句話的意思是由于AfxBeginThread()是MFC封裝的啟動(dòng)線程的函數(shù),里面包含了很多和MFC相關(guān)的啟動(dòng)信息,而且封裝了一些常用的操作,使用起來(lái)也比較簡(jiǎn)便。而用另外兩個(gè)函數(shù)就需要程序員對(duì)類(lèi)型,安全性檢查進(jìn)行更多的思考!

                   2、用_beginthreadex()函數(shù)應(yīng)該是最佳選擇,因?yàn)開(kāi)beginthreadex()函數(shù)是CRun-timeLibrary中的函數(shù),函數(shù)的參數(shù)和數(shù)據(jù)類(lèi)型都是CRun-timeLibrary中的類(lèi)型,這樣在啟動(dòng)線程時(shí)就不需要進(jìn)行Windows數(shù)據(jù)類(lèi)型和CRun-timeLibrary中的數(shù)據(jù)類(lèi)型之間的轉(zhuǎn)化。減低了線程啟動(dòng)時(shí)的資源消耗和時(shí)間的消耗!

                  3、在C程序中,幾乎都要用到new和delete,難道只有使用_beginthreadex()?不,因?yàn)镸FC也是C類(lèi)庫(kù)(只不過(guò)是Microsoft的C類(lèi)庫(kù),不是標(biāo)準(zhǔn)的C類(lèi)庫(kù)),在MFC中也封裝了new和delete兩中運(yùn)算符,所以用到new和delete的地方不一定非要使用_beginthreadex()函數(shù),用其他兩個(gè)函數(shù)都可以!其實(shí)在程序中使用上面的哪個(gè)函數(shù)并不是絕對(duì)的,書(shū)的作者只不過(guò)是提了一個(gè)更佳的搭配方法,我在MFC程序中也經(jīng)常使用_beginthreadex()和CreateThread()這兩個(gè)函數(shù),運(yùn)行的效果也沒(méi)有多大的區(qū)別,有的時(shí)候只是需要你額外的進(jìn)行一些類(lèi)型檢查和其他的一些轉(zhuǎn)化操作,其余沒(méi)有其他不妥! 創(chuàng)建線程只有一個(gè)方法是::CreateThread()。_beginthreadex()、AfxBeginThread()等內(nèi)部都是調(diào)用這個(gè)函數(shù)的,因?yàn)椴僮飨到y(tǒng)只提供這一個(gè)接口C靜態(tài)庫(kù)比WINDOWS出來(lái)還早,就別提多線程了,所以他對(duì)多線程的支持不是很好,但后悔也來(lái)不急,但也不能怪人家。

                  C運(yùn)行庫(kù)_beginthreadex()。他經(jīng)過(guò)一些處理后,再調(diào)用CreateThread()如果要強(qiáng)制結(jié)束的話也最好用_endthreadex結(jié)束,因?yàn)樗惨恍┨幚怼?總結(jié)上面的內(nèi)容,當(dāng)然《Windows核心編程》上面得說(shuō)法是比較權(quán)威的。所以,在對(duì)線程的結(jié)構(gòu)、運(yùn)行還不是很了解的時(shí)候最好還是按照書(shū)上的來(lái)。這樣能夠避免一些可能出現(xiàn)的莫名奇妙的錯(cuò)誤,也省去的一些其他結(jié)構(gòu)處理的考慮。當(dāng)你清楚地知道線程的結(jié)構(gòu)與運(yùn)行機(jī)制,以及了解各個(gè)函數(shù)對(duì)CreateThread函數(shù)的封裝的時(shí)候,大概那時(shí)候就能夠應(yīng)用自如了


            本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/haisujiang/archive/2009/05/30/4225109.aspx

            posted on 2011-04-25 13:49 厚積薄發(fā) 閱讀(384) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): Windows編程

            導(dǎo)航

            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            統(tǒng)計(jì)

            常用鏈接

            留言簿

            隨筆分類(lèi)

            文章分類(lèi)

            文章檔案

            搜索

            最新評(píng)論

            久久久不卡国产精品一区二区 | 久久久免费观成人影院| 欧美丰满熟妇BBB久久久| 无码国内精品久久综合88| 久久久黄片| 久久人人爽人人澡人人高潮AV| 精品水蜜桃久久久久久久| 欧美亚洲国产精品久久蜜芽| 色综合久久中文综合网| 国产精品久久久久久久久久免费| 国产福利电影一区二区三区久久老子无码午夜伦不 | 国产999精品久久久久久| 国产亚州精品女人久久久久久 | 精品国产乱码久久久久软件| 国内精品久久久久影院亚洲| 青青草原综合久久大伊人| 久久精品国产99久久久古代| 欧美噜噜久久久XXX| 国产成人精品久久二区二区| 久久青青草原综合伊人| 国内精品久久久久影院网站| 久久夜色精品国产www| 久久人妻少妇嫩草AV蜜桃| 精品久久人妻av中文字幕| 99国内精品久久久久久久| 人妻丰满?V无码久久不卡| 欧洲精品久久久av无码电影| 精品欧美一区二区三区久久久| 午夜精品久久影院蜜桃| 国产午夜免费高清久久影院| 国内精品久久久久久久涩爱| 亚洲精品乱码久久久久久蜜桃不卡 | 久久综合久久美利坚合众国| 国产欧美一区二区久久| 中文字幕精品久久| 国产产无码乱码精品久久鸭| 四虎影视久久久免费观看| 狠狠狠色丁香婷婷综合久久俺| 伊人情人综合成人久久网小说| 久久久九九有精品国产| 午夜久久久久久禁播电影|