資源描述:
《3.7windows2000xp的同步和通信機(jī)制》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、3.7Windows2000/XP的同步和通信機(jī)制3.7.1Windows2000/XP的同步和互斥機(jī)制3.7.2Windows2000/XP進(jìn)程通信機(jī)制3.7.1Windows2000/XP的同步和互斥機(jī)制Windows2000/XP提供互斥對(duì)象、信號(hào)量對(duì)象和事件對(duì)象及相應(yīng)系統(tǒng)調(diào)用,用于進(jìn)程和線程的同步。同步對(duì)象都有一個(gè)用戶(hù)指定的對(duì)象名稱(chēng),不同進(jìn)程中用同樣的對(duì)象名創(chuàng)建或打開(kāi)對(duì)象,從而獲得該對(duì)象在本進(jìn)程的句柄。從本質(zhì)上講,這些同步對(duì)象的能力是相同的,其區(qū)別在于適用場(chǎng)合和效率有所不同。CreateMutex創(chuàng)建互斥對(duì)象OpenMutex打開(kāi)并返回一個(gè)已存在的互斥對(duì)象句柄,用于后
2、續(xù)訪問(wèn)。ReleaseMutex釋放對(duì)互斥對(duì)象的占用,使之成為可用。信號(hào)量對(duì)象就是資源信號(hào)量,初始值所取范圍在0到指定最大值之間,用于限制并發(fā)訪問(wèn)的線程數(shù)。相關(guān)API包括:CreateSemaphore創(chuàng)建一個(gè)信號(hào)量對(duì)象,在輸入?yún)?shù)中指定初值和最大值,返回對(duì)象句柄。OpenSemaphore打開(kāi)并返回一個(gè)已存在的信號(hào)量對(duì)象句柄,用于后續(xù)訪問(wèn)。ReleaseSemaphore釋放對(duì)信號(hào)量對(duì)象的占用,使之成為可用。事件對(duì)象相當(dāng)于觸發(fā)器,用于通知一個(gè)或多個(gè)線程某事件的出現(xiàn),它的相關(guān)API包括:CreateEvent創(chuàng)建一個(gè)事件對(duì)象,返回對(duì)象句柄。OpenEvent打開(kāi)并返回一個(gè)已存在的
3、事件對(duì)象句柄,用于后續(xù)訪問(wèn)。SetEvent和PulseEvent設(shè)置指定事件對(duì)象為可用狀態(tài)。ResetEvent設(shè)置指定事件對(duì)象為不可用狀態(tài)。等待操作對(duì)于這三種同步對(duì)象,系統(tǒng)提供兩個(gè)等待操作:WaitForSingleObjec可在指定的時(shí)間內(nèi)等待指定對(duì)象為可用狀態(tài);WaitForMultipleObjects可在指定的時(shí)間內(nèi)等待多個(gè)對(duì)象為可用狀態(tài)。臨界區(qū)對(duì)象(1)只能用于在同一進(jìn)程內(nèi)使用的臨界區(qū),同一進(jìn)程內(nèi)各線程對(duì)它的訪問(wèn)是互斥進(jìn)行的。把變量說(shuō)明為CRITICAL_SECTION類(lèi)型,就可作為臨界區(qū)使用。臨界區(qū)對(duì)象(2)臨界區(qū)對(duì)象相關(guān)API有:InitializeCritic
4、alSection(對(duì)臨界區(qū)對(duì)象進(jìn)行初始化)、EnterCriticalSection(等待占用臨界區(qū)的使用權(quán),得到使用權(quán)時(shí)返回)、TryEnterCriticalSection(非等待方式申請(qǐng)臨界區(qū)的使用權(quán),申請(qǐng)失敗時(shí)返回0)、LeaveCriticalSection(釋放臨界區(qū)的使用權(quán))和DeleteCriticalSection(釋放與臨界區(qū)對(duì)象相關(guān)的所有系統(tǒng)資源)?;ユi變量訪問(wèn)互鎖變量訪問(wèn)API相當(dāng)于硬件指令,用于對(duì)整型變量的操作,可避免線程間切換對(duì)操作連續(xù)性的影響。API包括:InterlockedExchange(32位數(shù)據(jù)的先讀后寫(xiě)原子操作)、Interlocked
5、CompareExchange(依據(jù)比較結(jié)果進(jìn)行賦值的原子操作)、InterlockedExchangeAdd(先加后存結(jié)果的原子操作)、InterlockedDecrement(先減1后存結(jié)果的原子操作)和Interlockedincrement(先加1后存結(jié)果的原子操作)。3.7.2Windows2000/XP進(jìn)程通信機(jī)制信號(hào)(signal)共享存儲(chǔ)區(qū)(sharedmemory)管道(pipe)郵件槽(mailslot)套接字(socket)信號(hào)通信機(jī)制(1)信號(hào)(signal)是進(jìn)程與外界的一種低級(jí)通信方式,相當(dāng)于進(jìn)程的軟中斷。進(jìn)程可發(fā)送信號(hào),每個(gè)進(jìn)程都有指定的信號(hào)處理例程
6、,信號(hào)通信是單向和異步的。信號(hào)通信機(jī)制(2)信號(hào)量相關(guān)的系統(tǒng)調(diào)用,(1)SetConsoleCtrlHandler定義或取消本進(jìn)程的信號(hào)處理例程中的用戶(hù)定義例程。GenerateConsoleCrtlEvent可發(fā)送信號(hào)到與本進(jìn)程共享同一控制臺(tái)與控制臺(tái)進(jìn)程組。(2)signal用于設(shè)置中斷信號(hào)處理例程,raise用于發(fā)送信號(hào)。共享存儲(chǔ)區(qū)通信機(jī)制(1)用于進(jìn)程間大數(shù)據(jù)量通信。通信的進(jìn)程可任意讀寫(xiě)共享存儲(chǔ)區(qū),也可在共享存儲(chǔ)區(qū)上使用任意數(shù)據(jù)結(jié)構(gòu)。進(jìn)程使用共享存儲(chǔ)區(qū)時(shí),需要互斥和同步機(jī)制來(lái)確保數(shù)據(jù)的一致性。采用文件映射(filemapping)機(jī)制來(lái)實(shí)現(xiàn)共享存儲(chǔ)區(qū),用戶(hù)進(jìn)程可把整個(gè)文件映
7、射為進(jìn)程虛擬地址空間的一部分來(lái)加以訪問(wèn)。共享存儲(chǔ)區(qū)通信機(jī)制(2)共享存儲(chǔ)區(qū)相關(guān)的系統(tǒng)調(diào)用有:CreateFileMapping(為指定文件創(chuàng)建一個(gè)文件映射對(duì)象)、OpenFileMapping(打開(kāi)一個(gè)命名的文件映射對(duì)象)、MapViewOfFile(把文件映射到本進(jìn)程的地址空間)、FlushViewOfFile(把映射地址空間的內(nèi)容寫(xiě)到物理文件中)、UnmapViewOfFile(拆除文件與本進(jìn)程地址空間的映射關(guān)系)和CloseHandle(關(guān)閉文件映射對(duì)象)。管道通信機(jī)制(1