• <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>
            隨筆-4  評論-40  文章-117  trackbacks-0

            線程基本概念

            1.線程的組成

                       (1)線程內(nèi)核對象:用于管理線程及存儲線程的統(tǒng)計信息

                       (2)線程棧:維護線程執(zhí)行時需要的函數(shù)參數(shù)和局部變量。 線程棧所需的內(nèi)存是從進程中分配而得的,其大小默認是1M.

                           

                       每個線程都有自已獨立的線程棧。

                       進程不執(zhí)行任何代碼,所有的代碼都是由線程執(zhí)行的。進程相當于一個裝載線程的容器。

                      線程共享進程的地址空間和數(shù)據(jù),如內(nèi)核對象句柄(內(nèi)核對象句柄只能依附于某個進程而不是某個線程)

             

            2.線程函數(shù)原型

                        DWORD WINAPI ThreadFunc(PVOID pvParam)

                        {

                           DWORD dwResult = 0;

                           ...

                           return(dwResult);

                        }

             

                        The system allocates memory out of the process' address space for use by the thread's stack.

             

            3.終止線程

                          1.線程正常退出。系統(tǒng)會對線程函數(shù)內(nèi)創(chuàng)建的所有對象調(diào)用析構(gòu)函數(shù)。

                          2.ExitThread(). 線程退出, 系統(tǒng)會清理線程棧。 但是系統(tǒng)不會對線程函數(shù)內(nèi)創(chuàng)建的所有對象調(diào)用析構(gòu)函數(shù)。

                          3.TerminateThread().線程異步退出,系統(tǒng)不清理線程棧。只到擁有該線程的進程退出時才清理線程棧。

                           該函數(shù)是個異步函數(shù),它只會告訴系統(tǒng)去殺掉某個線程,但是系統(tǒng)不會保證當該函數(shù)返回時線程立刻終止。

                           因此我們?nèi)绻覀円_認線程已經(jīng)終止了,則需要用WaitForSingleObject()來等待線程結(jié)束。             

                          4.內(nèi)核對象由進程所擁有,用戶對象由線程擁有。線程可擁有兩種用戶對象:WindowsHook.

                          5.線程終止后,線程所擁有的用戶對象會被系統(tǒng)釋放。

                         6.GetExitCodeThread() //檢查線程是否已終止

             

            4.線程內(nèi)部細節(jié)

            1.CreateThread _beginthreadex 區(qū)別:

                         

                CreateThread是系統(tǒng)API,_beginthreadexCRT(C Run Time Library 運行時庫)函數(shù).     _beginthreadex內(nèi)部會調(diào)用CreateThread函數(shù)。 

                 _endthreadex會釋放_beginthreadextiddata結(jié)構(gòu)分配的內(nèi)存。

             

                如果線程函數(shù)中調(diào)用了CRT函數(shù)(注:不是全部CRT函數(shù) 只是其中一部分函數(shù)),則該線程函數(shù)必須_beginthreadex而不是CreateThread函數(shù)創(chuàng)建。否則會產(chǎn)生內(nèi)存泄露。

                如果在除主線程之外的任何線程中進行一下操作,你就應(yīng)該使用多線程版本的C runtime library,并使_beginthreadex_endthreadex

                          (1) 使用malloc()free(),或是newdelete

                          (2) 使用stdio.hio.h里面聲明的任何函數(shù)

                          (3) 使用浮點變量或浮點運算函數(shù)

                          (4) 調(diào)用任何一個使用了靜態(tài)緩沖區(qū)的runtime函數(shù),比如:asctime(),strtok()rand()

             

            2._beginthreadex_beginthread區(qū)別

             

                _beginthreadex內(nèi)部會自動調(diào)用 _endthreadex.

                _beginthread內(nèi)部會自動調(diào)用_endthread.

                         

                _endthread內(nèi)部會自動調(diào)用CloseHandle關(guān)閉當前Thread內(nèi)核對象的句柄,所以在用_beginthread 我們不需要在主線程中調(diào)用CloseHandle來關(guān)閉子線程的句柄。 

               _endthreadex相比_endthread而言更安全。它不會自動關(guān)閉當前Thread內(nèi)核對象的句柄。所以在用_beginthreadex時我們需要用CloseHandle來關(guān)閉子線程的句柄。

             

            5.偽句柄和真實句柄

             

            1.偽句柄(Pseudohandle):

             

                            HANDLE GetCurrentProcess();

                            HANDLE GetCurrentThread();                               

                           

            以上兩個函數(shù)會返回指向線程或進程內(nèi)核對象的偽句柄(其實以上兩個函數(shù)返回的是一個常數(shù)-1)。所以偽句柄的值永遠是指向當前線程或進程的。 

            如果把該值傳給子進程,該值則代表當前子進程的偽句柄。所以把句柄傳給子線程時一定要傳真時的句柄不能傳偽句柄。 

            該句柄不會增加內(nèi)核對象的引用計數(shù),所以不需要調(diào)用CloseHandle()函數(shù)。

                                           

              2.把偽句柄轉(zhuǎn)換成真實句柄

             

            DuplicateHandle會增加內(nèi)核對象的引用計數(shù),所以要用CloseHandle()來關(guān)閉復(fù)制所得的對象句柄。

                           

            6.Common API

             

                            DWORD GetCurrentProcessId();

                            DWORD GetCurrentThreadId();

                            HANDLE GetCurrentProcess();

                            HANDLE GetCurrentThread();

                                 DuplicateHandle()

            posted on 2010-04-20 18:12 李陽 閱讀(1351) 評論(0)  編輯 收藏 引用 所屬分類: C++
            国产精品久久久久AV福利动漫| 丁香五月网久久综合| 亚洲国产成人精品无码久久久久久综合 | 99久久久国产精品免费无卡顿 | 狠狠色综合网站久久久久久久| 国产亚洲精久久久久久无码AV| 三级韩国一区久久二区综合| 亚洲欧美日韩久久精品第一区| 精品综合久久久久久97超人| 久久久久久国产精品无码下载| 午夜精品久久久久久99热| 国产69精品久久久久99| 久久亚洲AV成人无码| 久久久久久久综合日本亚洲| 久久无码专区国产精品发布 | 亚洲精品NV久久久久久久久久| 久久久久亚洲AV无码专区体验| 国产精品欧美久久久久天天影视| 亚洲第一极品精品无码久久| 国产亚洲精午夜久久久久久| 欧美黑人激情性久久| 波多野结衣久久| 久久久久亚洲AV无码专区桃色| AV无码久久久久不卡蜜桃| 久久精品国产亚洲AV蜜臀色欲| 久久精品国产99久久久香蕉| 狠狠色婷婷综合天天久久丁香 | 久久久久久噜噜精品免费直播| 久久婷婷五月综合色奶水99啪| 久久综合五月丁香久久激情| 久久久中文字幕| 99久久国产热无码精品免费| 一本色道久久HEZYO无码| 久久受www免费人成_看片中文| 久久强奷乱码老熟女| 久久青青草原精品国产软件| 免费观看成人久久网免费观看| 72种姿势欧美久久久久大黄蕉 | 青草久久久国产线免观| 色综合合久久天天给综看| 人妻中文久久久久|