操作系統(tǒng)實驗線程的同步_第1頁
操作系統(tǒng)實驗線程的同步_第2頁
操作系統(tǒng)實驗線程的同步_第3頁
操作系統(tǒng)實驗線程的同步_第4頁
操作系統(tǒng)實驗線程的同步_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

操作系統(tǒng)實驗線程的同步部門:xxx

時間:xxx整理范文,僅供參考,可下載自行編輯實驗六線程的同步1、實驗目的(1)進一步掌握Windows系統(tǒng)環(huán)境下線程的創(chuàng)建與撤銷。(2)熟悉Windows系統(tǒng)提供的線程同步API。(3)使用Windows系統(tǒng)提供的線程同步API解決實際問題。2、實驗準備知識:相關(guān)API函數(shù)介紹①等待對象等待對象<waitfunctions)函數(shù)包括等待一個對象<WaitForSingleObject<))和等待多個對象<WaitForMultipleObject<))兩個API函數(shù)。b5E2RGbCAP1)等待一個對象WaitForSingleObject<)用于等待一個對象。它等待的對象可以為以下對象之一。?Changeontification:變化通知。?Consoleinput:控制臺輸入。?Event:事件。?Job:作業(yè)。?Mutex:互斥信號量。?Process:進程。?Semaphore:計數(shù)信號量。?Thread:線程。?Waitabletimer:定時器。原型:DWORDWaitForSingleObject(HANDLEhHandle,//對象句柄DWORDdwMilliseconds//等待時間);參數(shù)說明:(1)hHandle:等待對象的對象句柄。該對象句柄必須為SYNCHRONIZE訪問。dwMilliseconds:等待時間,單位為ms。若該值為0,函數(shù)在測試對象的狀態(tài)后立即返回,若為INFINITE,函數(shù)一直等待下去,直到接收到一個信號將其喚醒,如表2-1所示。p1EanqFDPw返回值:如果成功返回,其返回值說明是何種事件導致函數(shù)返回。表2-1函數(shù)描述訪問描述WAITABANDONED等待的對象是一個互斥<Mutex)對象,該互斥對象沒有被擁有它的線程釋放,它被設(shè)置為不能被喚醒WAITOBJECT0指定對象被喚醒WAITTIMEOUT超時用法舉例:StaticHANDLEhHandlel=NULL。DWORDdRes。//等待對象的句dRes=//等待對象的句柄為hHandlel,等待時間為10msDXDiTa9E3d2)等待對個對象WaitForMultiple<)bject<)在指定時間內(nèi)等待多個對象,它等待的對象與WaitForSingleObject<)相同。RTCrpUDGiT原型:DWORDWaitForMultipleObjects<DWORDnCount,//句柄數(shù)組中的句柄數(shù)CONSTHANDLE*lpHandles,//指向?qū)ο缶浔鷶?shù)組的指針BOOLfWaitAll,//等待類型DWORDdwMilliseconds//等待時間);參數(shù)說明:nCount:由指針*lpHandles指定的句柄數(shù)組中的句柄數(shù),最大數(shù)是MAXIMUMWAITOBJECTS。5PCzVD7HxA(2)*lpHandles:指向?qū)ο缶浔鷶?shù)組的指針。fWaitAll:等待類型。若為TRUE,當由lpHandles數(shù)組指定的所有對象被喚醒時函數(shù)返回;若為FALSE,當由IpHandles數(shù)組指定的某一個對象被喚醒時函數(shù)返回,且由返回值說明是由于哪個對象引起的函數(shù)返回。jLBHrnAILgdwMilliseconds:等待時間,單位為ms。若該值為0,函數(shù)測試對象的狀態(tài)后立即返回;若為INFINITE,函數(shù)一直等待下去,直到接收到一個信號將其喚醒。xHAQX74J0X返回值:、如果成功返回,其返回值說明是何種事件導致函數(shù)返回。各參數(shù)的描述如表2-2所示。表2-2各參數(shù)描述訪問描述WAITOBJECT0to<WAITOBJECT0+nCount-1)若bWaitAll為TRUE,返回值說明所有被等待的對象均被喚醒;若bWaitAll為FALSE,返回值減去WAITOBJECT0說明lpHandles數(shù)組下標指定的對象滿足等待條件。如果調(diào)用時多個對象同時被喚醒,則取多個對象中最小的那個數(shù)組下標WAITABANDONED0to<WAITABANDONED0+nCount-1)若bWaitAll為TRUE,返回值說明所有被等待的對象均被喚醒,并且至少有一個對象是沒有約束的互斥對象;若bWaitAll為FALSE,返回值減去WAITABANDONED0說明lpHandles數(shù)組下標指定的沒有約束的互斥對象滿足等待條件WAITTIMEOUT超時且參數(shù)bWaitAll指定的條件不能滿足信號量對象〈Semaphore)包括創(chuàng)建信號量<CreateSemaphore<))、打開信號量<OpenSemaphore<))及增加信號量的值<ReleaseSemaphore<))API函數(shù)。LDAYtRyKfE1)創(chuàng)建信號量CreateSemaphore<))用于創(chuàng)建一個信號量。原型:HANDLECreateSemaphore(LPSECURITYATTRIBUTESIpSemaphoreAttributes,//安全屬性Zzz6ZB2LtkLONGllnitialCount,//信號量對象的初始值dvzfvkwMIlLONGIMaximumCount,//信號量的最大值rqyn14ZNXILPCTSTRIpName//信號量名EmxvxOtOco);參數(shù)說明:<1)IpSemaphoreAttributes:指定安全屬性,為NULL時,信號量得到一個默認的安全描述符。llnitialCount:指定信號量對象的初始值。該值必須大于等于0,小于等于lMaximumCount。當其值大于0時,信號量被喚醒。當該函數(shù)釋放了一個等待該信號量的線程時,lInitialCount值減1,當調(diào)用函數(shù)ReleaseSemaphore<)時,按其指定的數(shù)量加一個值。SixE2yXPq5(3)lMaximumCount:指出該信號量的最大值,該值必須大于0。(4)lpName:給出信號量的名字。返回值:信號量創(chuàng)建成功,將返回該信號量的句柄。如果給出的信號量名是系統(tǒng)已經(jīng)存在的信號量,將返回這個已存在信號量的句柄。如果失敗,系統(tǒng)返回NULL,可以調(diào)用函數(shù)GetLastError<)查詢失敗的原因。6ewMyirQFL用法舉例:StaticHANDLEhHandlel=NULL;//定義一個句柄〃創(chuàng)建一個信號量,其初始值為0,最大值為5,信號量的名字為“SemphoreNamel”HHandle=CreateSemaphore<NULL,0,5,“SemphoreNamel”);2)打開信號量原型:HANDLEOpenSemaphore<DWORDdWDesiredAccess,//訪問標志BOOLbInheritHandle,//繼承標志LPCTSTRlpName//信號量名);參數(shù)說明:(1)dwDesiredAccess:指出打開后要對信號量進行何種訪問,如表2-3所示。表2-3訪問狀態(tài)訪問描述SEMAPHOREALLACCESS可以進行任何對信號量的訪問SEMAPHOREMODIFYSTATE可使用ReleaseSemaphore<)修改信號量的值,使信號量成為可用狀態(tài)SYNCHRONIZE使用等待函數(shù)<waitfunctions),等待信號量成為可用狀態(tài)<2)bInheritHandle:指出返回的信號量句柄是否可以繼承。<3)lpName:給出信號量的名字。返回值:信號量打開成功,將返回該號量的句柄;如果失敗,系統(tǒng)返回NULL,可以調(diào)用函數(shù)GetLastError<)查詢失敗的原因。kavU42VRUs用法舉例:

staticHANDLEhHandlel=NULL;//打開一個名為“SemphoreNamel”的信號量,之后可使用ReleaseSemaphore<)函數(shù)增加信號量的值hHandlel=OpenSemaphore<SEMAPHOREMODIFYSTATE,NULL,“SemphoreNamel”);y6v3ALoS893)增加信號量的值ReleaseSemaphore<)用于增加信號量的值。原型:BOOLReleaseSemaphore<//信號量對象句柄〃信號量要增加數(shù)值〃信號量要增加數(shù)值HANDLEhSemaphore,LONGlReleaseCount,LPLONGlpPreviousCount//信號量對象句柄〃信號量要增加數(shù)值〃信號量要增加數(shù)值hSemaphore:創(chuàng)建或打開信號量時給出的信號量對象句柄。WindowsNT中建議要使用SEMAPHOREMODIFYSTATE訪問屬性打開該信號量。M2ub6vSTnPIReleaseCount:信號量要增加的數(shù)值。該值必須大于0。如果增加該值后,大于信號量創(chuàng)建時給出的lMaximumCount值,則增加操作失效,函數(shù)返回FALSEo0YujCfmUCw

LpPreviousCounte:接收信號量值的一個32位的變量。若不需要接收該值,可以指定為NULL。eUts8ZQVRd返回值:如果成功,將返回一個非0值;如果失敗,系統(tǒng)返回0,可以調(diào)用函數(shù)GetLastError<)查詢失敗的原因。sQsAEJkW5T用法舉例:staticHANDLEhHandlel=NULL。BOOLrc。Rc=ReleaseSemaphore(hHandlel,l,NULL>。//給信號量的值加13、實驗內(nèi)容完成主、子兩個線程之間的同步,要求子線程先執(zhí)行。在主線程中使用系統(tǒng)調(diào)用GreateThread<)創(chuàng)建一個子線程。主線程創(chuàng)建子線程后進入阻塞狀態(tài),直到子線程運行完畢后喚醒主線程。GMsIasNXkA4、實驗要求能正確使用等待對象WaitForSingleObject<)或WaitForMultipleObject<)及信號量對象CreateSemaphore<)OpenSemaphore<)ReleaseSemaphore<)等系統(tǒng)調(diào)用,進一步理解線程的同步。TIrRGchYzg5、實驗指導CreateSemaphore<)OpenSemaphore<)具體操作過程:在MicrosoftVisualC++6.0環(huán)境下建立一個MFC支持的控制臺工程文件,編寫C程序,在程序中使用CreateSemaphore<NULL,0,1,“SemaphoreNamel”)創(chuàng)建一個名為“SemaphoreNamel”的信號量,信號量的初始值為0,之后使用0penSemaphore<SYNCHRONIZE|SEMAPHOSEMODIFYSTATE,NULL,“SemaphoreNamel”)打開該信號量,這里訪問標志用“SYNCHRONIZE|SEMAPHOREMODIFYSTATE”,以便之后可以使用WaitForSingleObject(>等待該信號量及使用ReleaseSemaphore<)釋放該信號量,然后創(chuàng)建一個子線程,主線程創(chuàng)建子線程后調(diào)用WaitForSingleObject<hHandlel,INFINITE),這里等待時間設(shè)置為INFINITE表示要一直等待下去,直到該信號量被喚醒為止。子線程結(jié)束,調(diào)用ReleaseSemaphor

溫馨提示

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

評論

0/150

提交評論