• <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)線程內核對象:用于管理線程及存儲線程的統計信息

                       (2)線程棧:維護線程執行時需要的函數參數和局部變量?!【€程棧所需的內存是從進程中分配而得的,其大小默認是1M.

                           

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

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

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

             

            2.線程函數原型

                        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.線程正常退出。系統會對線程函數內創建的所有對象調用析構函數。

                          2.ExitThread(). 線程退出, 系統會清理線程棧。 但是系統不會對線程函數內創建的所有對象調用析構函數。

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

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

                           因此我們如果我們要確認線程已經終止了,則需要用WaitForSingleObject()來等待線程結束。             

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

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

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

             

            4.線程內部細節

            1.CreateThread _beginthreadex 區別:

                         

                CreateThread是系統API,_beginthreadexCRT(C Run Time Library 運行時庫)函數.     _beginthreadex部會調用CreateThread函數。 

                 _endthreadex會釋放_beginthreadextiddata結構分配的內存。

             

                如果線程函數中調用了CRT函數(注:不是全部CRT函數 只是其中一部分函數),則該線程函數必須_beginthreadex而不是CreateThread函數創建。否則會產生內存泄露。

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

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

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

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

                          (4) 調用任何一個使用了靜態緩沖區的runtime函數,比如:asctime(),strtok()rand()

             

            2._beginthreadex_beginthread區別

             

                _beginthreadex內部會自動調用 _endthreadex.

                _beginthread內部會自動調用_endthread.

                         

                _endthread內部會自動調用CloseHandle關閉當前Thread內核對象的句柄,所以在用_beginthread 我們不需要在主線程中調用CloseHandle來關閉子線程的句柄。 

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

             

            5.偽句柄和真實句柄

             

            1.偽句柄(Pseudohandle):

             

                            HANDLE GetCurrentProcess();

                            HANDLE GetCurrentThread();                               

                           

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

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

            該句柄不會增加內核對象的引用計數,所以不需要調用CloseHandle()函數。

                                           

              2.把偽句柄轉換成真實句柄

             

            DuplicateHandle會增加內核對象的引用計數,所以要用CloseHandle()來關閉復制所得的對象句柄。

                           

            6.Common API

             

                            DWORD GetCurrentProcessId();

                            DWORD GetCurrentThreadId();

                            HANDLE GetCurrentProcess();

                            HANDLE GetCurrentThread();

                                 DuplicateHandle()

            posted on 2010-04-20 18:12 李陽 閱讀(1342) 評論(0)  編輯 收藏 引用 所屬分類: C++
            欧美午夜精品久久久久久浪潮| 久久水蜜桃亚洲av无码精品麻豆| 久久久女人与动物群交毛片| 无遮挡粉嫩小泬久久久久久久| 久久精品视频免费| 久久亚洲视频| 日本强好片久久久久久AAA| 久久91精品国产91久久麻豆| 日韩精品无码久久一区二区三| 亚洲午夜久久久久妓女影院| 国内精品久久久久久99蜜桃| 日本精品久久久久影院日本| 久久亚洲欧美国产精品| 久久久久亚洲AV无码去区首| 久久不见久久见免费视频7| 伊人久久大香线蕉成人| 国产成人综合久久精品尤物| 99精品国产在热久久无毒不卡| 久久影院午夜理论片无码| 久久久久久免费一区二区三区| 日日躁夜夜躁狠狠久久AV| 日本精品一区二区久久久| 久久国产热这里只有精品| 国产精品一久久香蕉国产线看| 无码久久精品国产亚洲Av影片 | 亚洲国产精品成人久久蜜臀| 成人国内精品久久久久一区| 久久精品国产久精国产一老狼| 天天做夜夜做久久做狠狠| 91亚洲国产成人久久精品| 久久99国产精品久久99| 99久久精品国内| 久久99国产精品二区不卡| 久久99精品国产麻豆宅宅| 99精品国产在热久久无毒不卡| 91精品国产9l久久久久| AV狠狠色丁香婷婷综合久久| 久久99国产综合精品| 91久久精品91久久性色| 国产福利电影一区二区三区,免费久久久久久久精 | 国产99久久久久久免费看|