系統(tǒng)創(chuàng)建一個線程內核對象。_第1頁
已閱讀1頁,還剩69頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第三章 Windows多線程編程,主要內容,Windows操作系統(tǒng)的一些基本知識 Win32 API線程庫 線程間通信 調度優(yōu)先級,1. Windows操作系統(tǒng)的一些基本知識,API ( Application Programming Interface ),操作系統(tǒng)是由本身的API定義的。API包含了所有構造操作系統(tǒng)的應用程序的函數(shù)接口,同時包含了相關的數(shù)據(jù)類型和結構。32位版本W(wǎng)indows的API被稱為Win32直接用

2、Win32 API編寫的應用程序,程序的執(zhí)行代碼小,運行效率高MFC用類庫的方式將Win32 API 進行封裝, 以類的方式提供給開發(fā)者Framework類庫提供了所有應用程序模型都要使用的一個面向對象的API集合,內核對象及句柄,內核對象是由操作系統(tǒng)內核分配的,只能由內核訪問的一個內存塊,用來供系統(tǒng)和應用程序使用和管理各種系統(tǒng)資源。內核對象包括:符號對象、事件對象、文件映射對象、I/O完成端口對象、作業(yè)對象、信箱對象、互斥量、管

3、道對象、進程對象、信標對象、線程對象和等待計時器對象等,這些對象通過調用函數(shù)來創(chuàng)建。不同的對象擁有不同的數(shù)據(jù)結構,它的成員負責維護該對象的各種信息。,內核對象及句柄,如何操作內核對象?Windows提供了一組函數(shù),使用這組函數(shù)來訪問內核對象。創(chuàng)建內核對象的函數(shù),會返回一個句柄,任何線程都可以使用這個值,把這個句柄傳遞給Windows的各個函數(shù),系統(tǒng)就知道操作哪個內核對象了。進程被初始化時,系統(tǒng)為它分配一個句柄表,用于保存該進程使

4、用的內核對象的信息,而句柄值則是相應內核對象在句柄表中的索引值,因此句柄值是進程相關的。內核對象由內核擁有,各個進程可以共享內核對象。進程中止執(zhí)行,它使用的內核對象并不一定會被撤銷。,2. Win32 API的線程庫,2.1 創(chuàng)建線程的基本問題,線程可以由進程中的任意線程創(chuàng)建,而進程的主線程在進程加載時自動創(chuàng)建。每個線程都有自己的進入點函數(shù)。主線程的進入點函數(shù),線程函數(shù)----線程的入口點,線程函數(shù)的返回值是該線程的退出代碼線程

5、函數(shù)應盡可能使用函數(shù)參數(shù)和局部變量,2.2 創(chuàng)建線程的API函數(shù),當創(chuàng)建線程時,系統(tǒng)創(chuàng)建一個線程內核對象。該線程內核對象不是線程本身,而是操作系統(tǒng)用來管理線程的較小的數(shù)據(jù)結構在進程的地址空間分配內存,供線程的堆棧使用,安全屬性 NULL,控制創(chuàng)建線程標志,線程ID,/STACK:[reserve][commit],C/C++多線程運行期庫中線程創(chuàng)建函數(shù) _beginthreadex,_beginthreadex函數(shù)在創(chuàng)建線程之前

6、會為線程分配數(shù)據(jù)塊(tiddata),并對數(shù)據(jù)塊初始化,然后將數(shù)據(jù)塊與線程聯(lián)系起來再為線程函數(shù)建立結構異?;幚韼瑏硖幚砭€程函數(shù)中的異常。,2.3 操作線程的API,暫停線程返回值是線程的前一個暫停計數(shù)線程暫停是線程內核對象的一個內部值,用于指明線程的暫停計數(shù)。使用要小心,因為不知道暫停線程運行時它在進行什么操作??赡茉斐伤梨i,2.3 操作線程的API,恢復線程返回值是線程的前一個暫停計數(shù)該函數(shù)用于將處于暫停狀態(tài)的線

7、程置于就緒狀態(tài),使其參加線程調度。,2.3 操作線程的API,使線程睡眠該函數(shù)是線程暫停自己的運行,直到睡眠時間過去為止當線程調用這個函數(shù)時,它自動放棄剩余的時間片,迫使系統(tǒng)進行線程調度。Windows不是實時的操作系統(tǒng)。,2.3 操作線程的API,終止線程線程函數(shù)返回(最好)通過調用ExitThread函數(shù),線程將自行撤銷同一個進程或另一個進程中的線程調用TerminateThread函數(shù)包含線程的進程終止,線程返回

8、函數(shù),線程中創(chuàng)建的C++類對象能夠正常撤銷操作系統(tǒng)將正確地釋放線程堆棧使用的內存系統(tǒng)將線程的退出代碼(線程內核對象維護)設置為線程函數(shù)的返回值系統(tǒng)將遞減線程內核對象的使用計數(shù),ExitThread函數(shù),線程調用這個函數(shù),強制線程終止運行導致操作系統(tǒng)清除該線程使用的所有操作系統(tǒng)資源。C++類對象將不被撤銷。,TerminateThread函數(shù),能夠撤銷任何線程線程的內核對象的使用計數(shù)也被遞減異步運行的函數(shù)不撤銷線程的堆棧,

9、直到進程終止,在進程終止運行時撤銷線程,ExitProcess 和 TerminateProcess函數(shù)可以終止線程,這些線程將會終止進程中的所有線程進程所使用的資源被清除剩余線程被撤銷C++對象撤銷函數(shù)沒有被調用,線程內核對象示意圖,,在進程終止運行時撤銷線程,2.4 一個簡單的Windows多線程程序,3. 線程間通信,操作系統(tǒng)隨機調度線程,程序員不能預知線程的執(zhí)行順序,3. 線程間通信,下面兩種情況下,線程間需要通信當有多

10、個線程訪問共享資源而不希望共享資源遭到破壞;(互斥)當一個線程需要將某個任務已經(jīng)完成的情況通知另外一個或多個線程時。(同步)Windows線程通信方法主要有互鎖函數(shù)、臨界段、事件、互斥量、信號量,3.1 互鎖函數(shù),互鎖函數(shù)是用來解決原子訪問的,主要針對變量的原子訪問;原子訪問:當線程訪問資源時,能夠確保沒有其它線程同時訪問相同的資源。,例子,Long g_x = 0; //全局變量DWORD WINAPI ThreadFunc1

11、 (PVOID pvParam){ g_x++;return 0;} DWORD WINAPI ThreadFunc2 (PVOID pvParam){ g_x++;return 0;},MOV EAX, [g_x]INC EAXMOV [g_x], EAX,遞增以原子方式運行,3.1 互鎖函數(shù),LONG InterlockedExchangeAdd()( PLONG plAd

12、dend, LONG lIncrement);Long g_x=0; //全局變量DWORD WINAPI ThreadFunc1 (PVOID pvParam){ InterlockedExchangeAdd(&g_x,1);return 0;} DWORD WINAPI ThreadFunc2 (PVOID pvParam){ InterlockedExchangeAdd(&g_x,1);

13、return 0;},3.1 互鎖函數(shù),以原子操作方式用第二個參數(shù)的值取代第一個參數(shù)的當前值。LONG InterlockedExchange ()( PLONG plTarget, LONG lValue);LONG InterlockedExchangePointer ()( PVOID* ppvTarget, PVOID pvValue);,3.1 互鎖函數(shù),比較第一個參數(shù)

14、所指的值和第三個參數(shù)的值,如果相等,則將第一個參數(shù)所指的值置為第二個參數(shù),如果不相等則不進行任何操作。LONG InterlockedCompareExchange ()( PLONG plDestination, LONG lExchange, LONG lComparand);LONG InterlockedCompareExchangePointer ()( PVOID* ppvDestination

15、, PVOID pvExchange, PVOID pvComparand);,3.2 臨界段,互鎖函數(shù):以原子操作方式修改單個值臨界段:以原子方式修改復雜的數(shù)據(jù)結構。臨界段:關鍵代碼段,是指一小段代碼,同一個時刻,只能有一個線程具有訪問權。多個線程訪問同一個臨界區(qū)的原則: 一次最多只能一個線程停留在臨界區(qū)內; 不能讓一個線程無限地停留在臨界區(qū)內,否則其它線程將不能進入該臨界區(qū),臨界段相關API函數(shù),4個函數(shù)用于臨界段首

16、先定義一個臨界段對象(通常全局變量)臨界段對象初始化進入臨界段離開臨界段釋放臨界段對象,臨界段應用舉例,,,,加上臨界段,,,,,3.3 使用內核對象的線程間通信,互鎖函數(shù)和臨界段都是在用戶態(tài)實現(xiàn)線程通信的,優(yōu)點速度快用戶態(tài)機制只能實現(xiàn)同一進程內線程通信。內核對象機制的適應性優(yōu)于用戶態(tài)機制,缺點速度慢。包含通知狀態(tài)和未通知狀態(tài)內核屬性的內核對象有:進程,線程,作業(yè),文件,控制臺輸入文件修改通知,事件,可

17、等待定時器信號量,互斥量,3.3 使用內核對象的線程間通信,線程可以使自己進入等待狀態(tài),直到一個對象變?yōu)橐淹ㄖ獱顟B(tài),這個功能通過等待函數(shù)完成。,3.4 事件,事件內核對象是最簡單的對象。一個使用計數(shù)一個布爾值,指明該事件是自動重置事件,還是人工重置事件;一個布爾值,指明該事件是已通知狀態(tài),還是未通知狀態(tài)。 當人工重置事件得到通知時,等待該事件的所有線程均變?yōu)榭烧{度事件;當自動重置事件得到通知時,等待該事件的線程中只有一個線程

18、變?yōu)榭烧{度線程。,3.4 事件,創(chuàng)建事件內核對象 當系統(tǒng)創(chuàng)建事件對象后,返回進程相關的事件對象的句柄。,3.4 事件,其它進程中的線程可以獲得事件對象的訪問權,方法:OpenEvent,EVENT_ALL_ACCESS,3.4 事件,一旦事件已經(jīng)創(chuàng)建,就可以直接控制它的狀態(tài)將事件設置為已通知狀態(tài)將事件設置為未通知狀態(tài),3.4 事件,事件的主要用途是標志事件的發(fā)生,并以此協(xié)調線程的執(zhí)行順序。例子:用戶在主線程輸入命

19、令,控制新建線程的運行。,,,,,,,,,3.5 互斥量,互斥量是一個種內核對象,確保線程擁有對單個資源的互斥訪問權。一個使用數(shù)量一個線程ID一個遞歸計數(shù)器互斥量的行為特征與臨界段相同,互斥量屬于內核對象,而臨界段屬于用戶方式對象?;コ饬康木€程ID標識系統(tǒng)中哪個線程擁有互斥量,為0,沒有線程擁有遞歸計數(shù)器指明線程擁有互斥量的次數(shù),3.5 互斥量,經(jīng)常用于保護多個線程訪問的內存塊;控制對共享資源的訪問 保證每次只能有一個線

20、程獲得互斥量,3.5 互斥量,互斥量的創(chuàng)建 另一個進程可獲得本進程相關的互斥量的句柄,3.5 互斥量,釋放互斥量 等待互斥量互斥量不同于其它內核對象,互斥對象有一個“線程所有權”的概念。,,,,,,,3.6 信號量,信號量是一個內核對象,可用來管理大量有限的系統(tǒng)資源 一個使用計數(shù)32位整數(shù),最大資源數(shù)量32位整數(shù),當前資源數(shù)量信號量使用規(guī)則:當前資源數(shù)量大于0,則等待信號量的線程獲得資源繼續(xù)運行,當前資源

21、數(shù)量減1當前資源數(shù)量等于0,則等待信號量的線程繼續(xù)等待,直到有線程釋放信號量,使當前資源數(shù)量大于0,3.6 信號量,創(chuàng)建信號量另一進程可獲得與本進程相關的信號量的句柄,3.6 信號量,釋放信號量,例,兩個線程分別有一個初值為0的Int型局部變量,兩個線程的行為是在一個循環(huán)中,使整型變量遞增,一個約束條件,在遞增過程中,這兩個值的差不超過5,,,,,4. 調度優(yōu)先級,4. 調度優(yōu)先級,Windows是一個多任務多線程操作系統(tǒng),

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論