2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩69頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

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

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

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

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

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

6、會(huì)為線程分配數(shù)據(jù)塊(tiddata),并對數(shù)據(jù)塊初始化,然后將數(shù)據(jù)塊與線程聯(lián)系起來再為線程函數(shù)建立結(jié)構(gòu)異常化處理幀來處理線程函數(shù)中的異常。,2.3 操作線程的API,暫停線程返回值是線程的前一個(gè)暫停計(jì)數(shù)線程暫停是線程內(nèi)核對象的一個(gè)內(nèi)部值,用于指明線程的暫停計(jì)數(shù)。使用要小心,因?yàn)椴恢罆和>€程運(yùn)行時(shí)它在進(jìn)行什么操作。可能造成死鎖,2.3 操作線程的API,恢復(fù)線程返回值是線程的前一個(gè)暫停計(jì)數(shù)該函數(shù)用于將處于暫停狀態(tài)的線

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

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

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

10、個(gè)線程訪問共享資源而不希望共享資源遭到破壞;(互斥)當(dāng)一個(gè)線程需要將某個(gè)任務(wù)已經(jīng)完成的情況通知另外一個(gè)或多個(gè)線程時(shí)。(同步)Windows線程通信方法主要有互鎖函數(shù)、臨界段、事件、互斥量、信號量,3.1 互鎖函數(shù),互鎖函數(shù)是用來解決原子訪問的,主要針對變量的原子訪問;原子訪問:當(dāng)線程訪問資源時(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,遞增以原子方式運(yùn)行,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ù),以原子操作方式用第二個(gè)參數(shù)的值取代第一個(gè)參數(shù)的當(dāng)前值。LONG InterlockedExchange ()( PLONG plTarget, LONG lValue);LONG InterlockedExchangePointer ()( PVOID* ppvTarget, PVOID pvValue);,3.1 互鎖函數(shù),比較第一個(gè)參數(shù)

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

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

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

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

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

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

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

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

溫馨提示

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

評論

0/150

提交評論