<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Windows線程基礎

      線程由兩部分組成:線程內核對象和線程棧。關于內核對象請看windows內核對象簡介

      線程內核對象,操作系統用線程內核對象來管理線程,操作系統還用它來存放統計信息。

      線程棧,用于維護線程執行時所需的所有函數參數和局部變量,就是C#程序員常說的線程棧和托管堆中的線程棧。

      我們知道進程是有惰性的,它的所有工作都是由線程完成的,而進程只是為線程提供場地,線程函數執行我們讓它執行的任務,最終線程函數將終止運行并返回,線程將終止運行,線程的內存將被釋放,線程內核對象的使用計數將減一,如果線程內核對象的使用計數減為0,線程內核對象將被銷毀。

      說了這么多,感覺有點虛,我們還是來看看創建線程的函數吧。

      CreateThread(

          LPSECURITY_ATTRIBUTES lpThreadAttributes,

          SIZE_T dwStackSize,

          LPTHREAD_START_ROUTINE lpStartAddress,

          LPVOID lpParameter,

          DWORD dwCreationFlags,

          PDWORD lpThreadId

      );

      lpThreadAttributes:用于設置線程的安全性,線程內核對象是否可以被進程的子進程所繼承,詳細了解我的這篇文章windows內核對象簡介

      dwStackSize:用于設置線程棧的大小,默認為1MB

      lpStartAddress:線程所執行的函數的地址

      lpParameter:線程函數的參數

      dwCreationFlags:用于標識線程是否馬上執行

      lpThreadId:線程ID

      創建線程。調用CreateThread時,系統會創建一個線程內核對象,這個內核對象由操作系統管理,當它的使用計數為0時,會被自動銷毀。而當前進程的句柄表也會有一項用于紀錄線程內核對象,表示對它的一個引用,同時系統會在進程的地址空間中分配一塊內存共線程棧使用。新線程可以訪問進程句柄表中的所有內核對象,內核對象由系統內核管理,而進程句柄表維護該進程所用到的內核對象的引用,而線程則通過句柄表中內核對象的地址引用內核對象。新線程還可以訪問進程的所有內存以及進程中所有線程的棧,如子線程可以很方便的訪問主線程的棧。還有一點需要說明的就是,線程內核對象創建完成之后,線程并不會馬上執行,因為線程棧的內存分配和初始化時要時間的,等一切就緒后進程才會開始執行。

      終止線程。最好讓線程函數自動返回,而不應該強制終止線程函數,因為線程函數在返回前還要做些清理工作,如析構對象,回收內存,讓操作系統正確釋放線程棧使用的內存,如果強制終止關閉線程,可能這些工作就不能正確的執行,很可能就會出現內存泄露。

      線程內幕。對CreateThread的調用產生一個線程內核對象,內核對象的使用計數為2,個人認為使用計數為2的原因是:當前進程對它的引用,還有就是保證在線程函數返回是內核對象不用馬上自動銷毀,因為當前函數返回時內核對象的使用計數肯定要減一,當減為0時內核對象將自動銷毀。還要初始化內核對象的其他屬性,并將內核對象設為未觸發狀態,使其隨時可以被執行。等內核對象和線程棧內存一切就緒,系統就會將兩個值寫入新線程棧的最上端,一個是線程函數的參數,一個是線程函數的地址。

      每個線程都有自己的一組CPU寄存器,即為線程的上下文。上下文反映了當前線程執行一次時線程CPU寄存器的狀態。因為一個線程可能要經過多次的CPU輪詢,才能執行完成,在每次CPU時間用完之前保存CPU寄存器的狀態,好讓下次輪詢到達時繼續執行。線程CPU寄存器全部都保存在一個CONTEXT結構中,而CONTEXT本身保存在線程內核對象中。指令指針寄存器和棧指針寄存器是線程上下文中兩個重要的寄存器,線程始終在線程的上下文中運行,當線程的內核對象被初始化時,CONTEXT結構的堆棧指針寄存器被設為函數在線程棧中的地址,而指令指針寄存器被設為RtlUserThreadStart函數的地址,而函數RtlUserThreadStart則是線程開始的地方。

      最后想說的是,建議用_beginthreadex代替CreateThread創建函數。

      作者:陳太漢

      博客:http://www.rzrgm.cn/hlxs/

      posted @ 2012-12-16 22:49  古文觀芷  閱讀(4704)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 午夜射精日本三级| 亚洲精品男男一区二区| 综合人妻久久一区二区精品| 国产91午夜福利精品 | 久久久国产乱子伦精品作者| 98精品全国免费观看视频| 欧洲精品码一区二区三区| 欧美牲交A欧美在线| 亚洲国模精品一区二区| 亚洲18禁一区二区三区| 精品国产色情一区二区三区| 无码精品人妻一区二区三区中| 免费看的日韩精品黄色片| 天堂а√在线中文在线| 亚洲精品无码久久一线| 国产91色综合久久高清| 亚洲精品一区国产精品| 国产免费午夜福利在线播放| 日本一码二码三码的区分| 99久久99久久精品国产片| 免费极品av一视觉盛宴| 怡红院一区二区三区在线| 天堂中文在线资源| 免费无码一区二区三区蜜桃| 国产色无码精品视频免费| 国产精品久久久久久爽爽爽| 日韩精品亚洲aⅴ在线影院| 亚洲国产成人精品女久久| 欧美色丁香| 亚洲av中文乱码一区二| 国产亚洲精品中文字幕| 国产欧美精品aaaaaa片| 亚洲第四色在线中文字幕| 亚洲天堂av日韩精品| 欧美嫩交一区二区三区| 日本黄色三级一区二区三区| 99RE6在线视频精品免费下载| 国产日韩精品欧美一区灰| 亚洲熟妇无码八av在线播放| 亚洲精品国产精品不乱码| 2021亚洲国产精品无码|