




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
網(wǎng)絡(luò)游戲開(kāi)發(fā)語(yǔ)言基礎(chǔ)
——Windows程序設(shè)計(jì)第4章多線程基礎(chǔ)第4章多線程基礎(chǔ)線程同步線程同步線程同步掌握進(jìn)程同步的基本方式4.4線程同步4.4.1全局變量線程需要在下面兩種情況下互相進(jìn)行通信:1)當(dāng)有多個(gè)線程訪問(wèn)共享資源而不使資源被破壞時(shí);2)當(dāng)一個(gè)線程需要將某個(gè)任務(wù)已經(jīng)完成的情況通知另外一個(gè)或多個(gè)線程時(shí)。第4章多線程基礎(chǔ)4.4線程同步4.4.1全局變量1.互鎖函數(shù)線程同步問(wèn)題在很大程度上與原子訪問(wèn)有關(guān),所謂原子訪問(wèn),是指線程在訪問(wèn)資源時(shí)能夠確保所有其他線程都不在同一時(shí)間內(nèi)訪問(wèn)相同的資源。示例longg_nValue=0;DWORDWINAPIThread1(LPVOIDlpParam){ g_nValue++; return0;}DWORDWINAPIThread2(LPVOIDlpParam){ g_nValue++; return0;}第4章多線程基礎(chǔ)4.4線程同步4.4.1全局變量1.互鎖函數(shù)Windows是個(gè)搶占式多線程環(huán)境,一個(gè)線程可以隨時(shí)中斷運(yùn)行,而另一個(gè)線程則可以隨時(shí)繼續(xù)執(zhí)行。因此,上述代碼可能執(zhí)行如下: MOVEAX,[g_nValue] INCEAX MOVEAX,[g_nValue] INCEAX MOV[g_nValue],EAX MOV[g_nValue],EAX最終結(jié)果是變量只增加了1第4章多線程基礎(chǔ)4.4線程同步4.4.1全局變量1.互鎖函數(shù)所有的互鎖函數(shù)都能以原子的方式對(duì)一個(gè)數(shù)進(jìn)行操作。LONGInterlockedExchangeAdd(LONGvolatile*Addend,//要修改的變量的指針
LONGValue //要增加的值);互鎖函數(shù)有很多,可以根據(jù)不同需要選擇相應(yīng)的函數(shù)第4章多線程基礎(chǔ)4.4線程同步4.4.1全局變量1.互鎖函數(shù)longg_nValue=0;DWORDWINAPIThread1(PVOIDpvParam){ InterlockedExchangeAdd(&g_nValue,1); return0;}DWORDWINAPIThread2(PVOIDpvParam){ InterlockedExchangeAdd(&g_nValue,1); return0;}示例第4章多線程基礎(chǔ)4.4線程同步4.4.1全局變量2.volatile關(guān)鍵字由于線程優(yōu)先級(jí)的原因,會(huì)導(dǎo)致出現(xiàn)死鎖現(xiàn)象。boolg_bFinishedCalculation=false;intWINAPIWinMain(...){ CreateThread(...,RecalcFun,...); while(!g_bFinishedCalculation){...;}}DWORDWINAPIRecaluFun(PVOIDpvParam){ g_bFinishedCalculation=true; return0;}示例第4章多線程基礎(chǔ)4.4線程同步4.4.1全局變量2.volatile關(guān)鍵字在聲明全局變量時(shí),增加關(guān)鍵字volatile。關(guān)鍵字volatile的作用是告訴編譯器,變量可以被應(yīng)用程序本身以外的某個(gè)對(duì)象進(jìn)行修改,volatile限定詞會(huì)告訴編譯器,不要對(duì)該變量進(jìn)行任何優(yōu)化,并且總是重新加載來(lái)自該變量的內(nèi)存單元的值。volatileboolg_bFinishedCalculation=false;示例第4章多線程基礎(chǔ)4.4線程同步4.4.1全局變量3.臨界區(qū)臨界區(qū)工作原理聲明臨界區(qū)變量變量是否被修改線程掛起線程執(zhí)行否是第4章多線程基礎(chǔ)4.4線程同步4.4.1全局變量3.臨界區(qū)實(shí)現(xiàn)步驟:聲明臨界區(qū)變量CRITICAL_SECTIONg_cs;在線程函數(shù)中檢測(cè)臨界區(qū)變量DWORDWINAPIFirstThread(PVOIDpvParam){ EnterCriticalSection(&g_cs); …… LeaveCriticalSection(&g_cs); }}第4章多線程基礎(chǔ)4.4線程同步4.4.2事件1.通知狀態(tài)事件是基于內(nèi)核對(duì)象的同步機(jī)制。進(jìn)程和線程也屬于內(nèi)核對(duì)象,可以用于同步的目的。對(duì)于線程同步來(lái)說(shuō),這些內(nèi)核對(duì)象中的每種對(duì)象都可以說(shuō)是處于已通知或未通知的狀態(tài)之中。這種狀態(tài)的切換是由系統(tǒng)為每個(gè)對(duì)象建立的一套規(guī)則來(lái)決定的。當(dāng)進(jìn)程正在運(yùn)行的時(shí)候,進(jìn)程內(nèi)核對(duì)象處于未通知狀態(tài),當(dāng)進(jìn)程終止運(yùn)行的時(shí)候,它就變?yōu)橐淹ㄖ獱顟B(tài)。第4章多線程基礎(chǔ)4.4線程同步4.4.2事件1.通知狀態(tài)當(dāng)線程等待的對(duì)象處于未通知狀態(tài)中時(shí),這些線程不可調(diào)度。但是一旦對(duì)象變?yōu)橐淹ㄖ獱顟B(tài),線程看到該標(biāo)志后就會(huì)變?yōu)榭烧{(diào)度狀態(tài),并且很快恢復(fù)運(yùn)行。第4章多線程基礎(chǔ)4.4線程同步4.4.2事件2.等待函數(shù)等待函數(shù)可使線程自愿進(jìn)入等待狀態(tài),直到一個(gè)特定的內(nèi)核對(duì)象變?yōu)橐淹ㄖ獱顟B(tài)為止。DWORDWaitForSingleObject(HANDLEhHandle, //內(nèi)核對(duì)象句柄
DWORDdwMilliseconds //等待時(shí)間,以毫秒為單位);示例WaitForSingleObject(hProcess,INFINITE);調(diào)用函數(shù)準(zhǔn)備等待到hProcess句柄標(biāo)識(shí)的進(jìn)程終止運(yùn)行為止,第2個(gè)參數(shù)告訴系統(tǒng),調(diào)用線程愿意永遠(yuǎn)等待下去(無(wú)限時(shí)間量),直到該進(jìn)程終止運(yùn)行。第4章多線程基礎(chǔ)4.4線程同步4.4.2事件3.事件內(nèi)核對(duì)象事件內(nèi)核對(duì)象是個(gè)最基本的對(duì)象。它們包含一個(gè)使用計(jì)數(shù)(與所有內(nèi)核對(duì)象一樣),一個(gè)用于指明該事件是個(gè)自動(dòng)重置的事件還是一個(gè)人工重置事件的布爾值,另一個(gè)用于指明該事件處于已通知狀態(tài)還是未通知狀態(tài)的布爾值。事件能夠通知一個(gè)操作已經(jīng)完成。有兩種不同類型的事件對(duì)象。一種是人工重置的事件,另一種是自動(dòng)重置的事件。當(dāng)人工重置的事件得到通知時(shí),等待該事件的所有線程均變?yōu)榭烧{(diào)度線程。當(dāng)一個(gè)自動(dòng)重置的事件得到通知時(shí),等待該事件的線程中只有一個(gè)線程變?yōu)榭烧{(diào)度線程。第4章多線程基礎(chǔ)4.4線程同步4.4.2事件3.事件內(nèi)核對(duì)象CreateEvent函數(shù)用于創(chuàng)建事件內(nèi)核對(duì)象。HANDLECreateEvent(LPSECURITY_ATTRIBUTESlpEventAttributes,//設(shè)置安全性BOOLbManualReset, //自動(dòng)事件還是手動(dòng)事件BOOLbInitialState, //事件的初始化值LPCTSTRlpName //事件內(nèi)核對(duì)象的名稱);第4章多線程基礎(chǔ)4.4線程同步4.4.2事件3.事件內(nèi)核對(duì)象得到事件內(nèi)核對(duì)象后,可以設(shè)置它的值。BOOLSetEvent(HANDLEhEvent //事件對(duì)象的句柄);修改事件為已通知狀態(tài)BOOLResetEvent(HANDLEhEvent //事件對(duì)象的句柄);修改事件為未通知狀態(tài)第4章多線程基礎(chǔ)4.4線程同步4.4.2事件3.事件內(nèi)核對(duì)象intWINAPIWinMain(...){ g_hEvent=CreateEvent(NULL,TRUE,FALSE,NULL); HANDLEhThread[3]; DWORDdwThreadID; hThread[0]=_beginthreadex(NULL,0,WordCount, NULL,0,dwThreadID); …... SetEvent(g_hEvent);}示例在主線程中創(chuàng)建事件,設(shè)為已通知狀態(tài)。第4章多線程基礎(chǔ)4.4線程同步4.4.2事件3.事件內(nèi)核對(duì)象DWORDWINAPIWordCount(PVOIDpvParam){ WaitForSingleObject(g_hEvent,INFINITE); ...//做相關(guān)工作
SetEvent(g_hEvent); return0;}示例在各個(gè)子線程中等待事件通知,完成后修改事件,設(shè)為已通知狀態(tài)。第4章多線程基礎(chǔ)4.4線程同步4.4.3互斥內(nèi)核對(duì)象互斥(mutex)內(nèi)核對(duì)象能夠確保線程擁有對(duì)單個(gè)資源的互斥訪問(wèn)權(quán)?;コ鈱?duì)象包含一個(gè)使用數(shù)量,一個(gè)線程ID和一個(gè)遞歸計(jì)數(shù)器。互斥對(duì)象的行為特性與臨界區(qū)相同,但是互斥對(duì)象屬于內(nèi)核對(duì)象,而臨界區(qū)則屬于用戶方式對(duì)象。ID用于標(biāo)識(shí)系統(tǒng)中的哪個(gè)線程當(dāng)前擁有互斥對(duì)象,遞歸計(jì)數(shù)器用于指明該線程擁有互斥對(duì)象的次數(shù)。第4章多線程基礎(chǔ)4.4線程同步4.4.3互斥內(nèi)核對(duì)象互斥對(duì)象的使用規(guī)則如下:如果線程ID是0(這是個(gè)無(wú)效ID),互斥對(duì)象不被任何線程所擁有,并且發(fā)出該互斥對(duì)象的通知信號(hào);如果ID是個(gè)非0數(shù)字,那么一個(gè)線程就擁有互斥對(duì)象,并且不發(fā)出該互斥對(duì)象的通知信號(hào);與所有其他內(nèi)核對(duì)象不同,互斥對(duì)象在操作系統(tǒng)中擁有特殊的代碼,允許它們違反正常的規(guī)則。第4章多線程基礎(chǔ)4.4線程同步4.4.3互斥內(nèi)核對(duì)象函數(shù)CreateMutex用于創(chuàng)建互斥對(duì)象:HANDLECreateMutex(LPSECURITY_ATTRIBUTESlpMutexAttributes,//安全特性結(jié)構(gòu)
BOOLbInitialOwner, //初始狀態(tài)
LPCTSTRlpName //互斥對(duì)象的名字字符串指針);bInitialOwner參數(shù)用于控制互斥對(duì)象的初始狀態(tài)。如果傳遞FALSE,那么互斥對(duì)象的ID和遞歸計(jì)數(shù)器均被設(shè)置為0。如果為bInitialOwner參數(shù)傳遞TRUE,那么該對(duì)象的線程ID被設(shè)置為調(diào)用線程的ID,遞歸計(jì)數(shù)器被設(shè)置為1。第4章多線程基礎(chǔ)4.4線程同步4.4.3互斥內(nèi)核對(duì)象通過(guò)調(diào)用ReleaseMutex函數(shù),可以釋放當(dāng)前進(jìn)程(線程)對(duì)mutex對(duì)象的擁有權(quán)。BOOLReleaseMutex(HANDLE
hMutex
);
第4章多線程基礎(chǔ)4.4線程同步4.4.3互斥內(nèi)核對(duì)象通過(guò)調(diào)用一個(gè)等待函數(shù),并傳遞負(fù)責(zé)保護(hù)資源的互斥對(duì)象的句柄,線程就能夠獲得對(duì)共享資源的訪問(wèn)權(quán)。在內(nèi)部,等待函數(shù)要檢查線程的ID,以了解它是否是0(互斥對(duì)象發(fā)出通知信號(hào))。如果線程ID是0,那么該線程ID被設(shè)置為調(diào)用線程的ID,遞歸計(jì)數(shù)器被設(shè)置為1,同時(shí),調(diào)用線程保持可調(diào)度狀態(tài)。如果等待函數(shù)發(fā)現(xiàn)ID不是0(不發(fā)出互斥對(duì)象的通知信號(hào)),那么調(diào)用線程便進(jìn)入等待狀態(tài)。系統(tǒng)將記住這個(gè)情況,并且在互斥對(duì)象的ID重新設(shè)置為0時(shí),將線程ID設(shè)置為等待狀態(tài)中的線程ID,將遞歸計(jì)數(shù)器設(shè)置為1,并且允許等待線程再次成為可調(diào)度線程。第4章多線程基礎(chǔ)4.4線程同步4.4.4信號(hào)量信號(hào)量?jī)?nèi)核對(duì)象用于對(duì)資源進(jìn)行計(jì)數(shù)。它們與所有內(nèi)核對(duì)象一樣,包含一個(gè)使用數(shù)量,但是它們也包含另外兩個(gè)帶符號(hào)的32位值,一個(gè)是最大資源數(shù)量,一個(gè)是當(dāng)前資源數(shù)量。信號(hào)量可以用于線程池技術(shù)。線程池線程池是多線程開(kāi)發(fā)中為了避免頻繁的創(chuàng)建和撤消線程,而采用的一種線程管理技術(shù)。它采用一組固定的線程交替執(zhí)行相關(guān)的任務(wù),減少了由于創(chuàng)建線程和撤消線程引起的各種時(shí)間和空間上的開(kāi)銷,提高了程序的執(zhí)行效率。第4章多線程基礎(chǔ)4.4線程同步4.4.4信號(hào)量信號(hào)量的使用規(guī)則如下:1)如果當(dāng)前資源的數(shù)量大于0,則發(fā)出信標(biāo)信號(hào);2)如果當(dāng)前資源數(shù)量是0,則不發(fā)出信標(biāo)信號(hào);3)系統(tǒng)決不允許當(dāng)前資源的數(shù)量為負(fù)值;4)當(dāng)前資源數(shù)量決不能大于最大資源數(shù)量。第4章多線程基礎(chǔ)4.4線程同步4.4.4信號(hào)量可以調(diào)用CreateSemaphore函數(shù)來(lái)創(chuàng)建信號(hào)量。HANDLECreateSemaphore(LPSECURITY_ATTRIBUTESlpSemaphoreAttributes,//安全屬性結(jié)構(gòu)
LONGlInitialCount,//初始化時(shí)的資源數(shù)量
LONGlMaximumCount,//最大的資源數(shù)量
LPCTSTRlpName//信號(hào)量的名字字符串);第4章多線程基礎(chǔ)4.4線程同步4.4.4信號(hào)量通過(guò)調(diào)用ReleaseSemaphore函數(shù),來(lái)釋放對(duì)于當(dāng)前信號(hào)量的占用,并且初始化下一次信號(hào)量的數(shù)量(受創(chuàng)建時(shí)信號(hào)量的總數(shù)限制)。BOOLReleaseSemaphore(
HANDLEhSemaphore,LONGlReleaseCount,LPLONGlpPreviousCount
);
第4章多線程基礎(chǔ)4.4線程同步4.4.5等待計(jì)時(shí)器等待定時(shí)器是在某個(gè)時(shí)間或按規(guī)定的間隔時(shí)間發(fā)出自己的信號(hào)通知的內(nèi)核對(duì)象。HANDLECreateWaitableTimer(LPSECURITY_ATTRIBUTESlpTimerAttributes,BOOLbManualReset,LPCTSTRlpTimerName);若要?jiǎng)?chuàng)建等待定時(shí)器,只需要調(diào)用CreateWaitableTimer函數(shù)。第4章多線程基礎(chǔ)4.4線程同步4.4.5等待計(jì)時(shí)器等待定時(shí)器對(duì)象總是在未通知狀態(tài)中創(chuàng)建。必須調(diào)用SetWaitableTimer函數(shù)來(lái)告訴定時(shí)器在何時(shí)讓它成為已通知狀態(tài)。BOOLSetWaitableTimer(HANDLEhTimer,constLARGE_INTEGER*pDueTime,LONGlPeriod,PTIMERAPCROUTINEpletionRoutine,LPVOIDpletionRoutine,BOOLfResume
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 漁船租賃業(yè)務(wù)合同協(xié)議
- 銀行信托計(jì)劃保管合同模板
- 供港農(nóng)產(chǎn)品購(gòu)銷合同代理協(xié)議(樣本)
- 國(guó)有林權(quán)出讓合同
- 畢業(yè)生實(shí)習(xí)與勞動(dòng)合同解析
- 渠道合作銷售合同范本
- 合同法視角:股東不履行義務(wù)糾紛案例分析
- 新車銷售團(tuán)隊(duì)心理素質(zhì)訓(xùn)練考核試卷
- 木制拼圖游戲考核試卷
- 世界音樂(lè)教育項(xiàng)目的策劃與實(shí)施考核試卷
- 免疫性血小板減少性紫癜36張課件
- 10-化學(xué)動(dòng)力學(xué)基礎(chǔ)-1-考研試題資料系列
- 工傷保險(xiǎn)待遇核定表(樣表)
- DB33- 1015-2021《居住建筑節(jié)能設(shè)計(jì)標(biāo)準(zhǔn)》
- DB1310T 225-2020 木本植物滯納空氣顆粒物能力測(cè)定方法
- (高職)國(guó)際金融(第四版)電子課件(全套)
- 《飲料工藝學(xué)》課件第一章-緒論
- 中外合作辦學(xué)的可行性報(bào)告
- 母嬰保健課程標(biāo)準(zhǔn)
- 《農(nóng)民專業(yè)合作社登記管理?xiàng)l例》條文解讀(一
- 一年級(jí)的小豌豆我喜歡的一本書(shū)(課堂PPT)
評(píng)論
0/150
提交評(píng)論