windows多線(xiàn)程同步_第1頁(yè)
windows多線(xiàn)程同步_第2頁(yè)
windows多線(xiàn)程同步_第3頁(yè)
windows多線(xiàn)程同步_第4頁(yè)
windows多線(xiàn)程同步_第5頁(yè)
已閱讀5頁(yè),還剩27頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、3. Windows線(xiàn)程同步技術(shù)線(xiàn)程同步技術(shù)線(xiàn)程線(xiàn)程1共享數(shù)據(jù)共享數(shù)據(jù)線(xiàn)程線(xiàn)程2出問(wèn)題啦!出問(wèn)題啦!程序的并發(fā)執(zhí)行往往帶來(lái)與時(shí)間有關(guān)的錯(cuò)誤,甚至?xí)l(fā)程序的并發(fā)執(zhí)行往往帶來(lái)與時(shí)間有關(guān)的錯(cuò)誤,甚至?xí)l(fā)災(zāi)難,因此需要引入同步機(jī)制,即協(xié)同多個(gè)動(dòng)作,該過(guò)程災(zāi)難,因此需要引入同步機(jī)制,即協(xié)同多個(gè)動(dòng)作,該過(guò)程就稱(chēng)作同步(就稱(chēng)作同步(Synchronization)1. Win32原子訪(fǎng)問(wèn)原子訪(fǎng)問(wèn)Interlocked系列函數(shù)系列函數(shù)n所謂原子訪(fǎng)問(wèn),是指線(xiàn)程在訪(fǎng)問(wèn)資源時(shí)能夠確保所有其他線(xiàn)程所謂原子訪(fǎng)問(wèn),是指線(xiàn)程在訪(fǎng)問(wèn)資源時(shí)能夠確保所有其他線(xiàn)程都不在同一時(shí)間內(nèi)訪(fǎng)問(wèn)相同的資源。都不在同一時(shí)間內(nèi)訪(fǎng)問(wèn)相同的資源。

2、ninterlocked系列函數(shù):用于單個(gè)變量的原子操作,以及系列函數(shù):用于單個(gè)變量的原子操作,以及spinlock(旋轉(zhuǎn)鎖旋轉(zhuǎn)鎖 ),不受編譯器和,不受編譯器和CPU架構(gòu)、數(shù)量的影響。架構(gòu)、數(shù)量的影響。nInterlocked函數(shù)族的執(zhí)行速度相當(dāng)快,通常不超過(guò)函數(shù)族的執(zhí)行速度相當(dāng)快,通常不超過(guò)50個(gè)個(gè)CPU周周期,且無(wú)需在用戶(hù)模式和內(nèi)核模式間轉(zhuǎn)換。期,且無(wú)需在用戶(hù)模式和內(nèi)核模式間轉(zhuǎn)換。n幾個(gè)原子訪(fǎng)問(wèn)幾個(gè)原子訪(fǎng)問(wèn)API:nInterlockedIncrement()nInterlockedDecrement ()nInterlockedExchangeAdd ()nInterlockedExc

3、hange() long g_x = 0; DWORD WINAPI ThreadFunc1(PVOID pvParam)InterlockedExchangeAdd(&g_x, 2); return 0; DWORD WINAPI ThreadFunc2(PVOID pvParam) InterlockedExchangeAdd(&g_x, 5); return 0; long g_x = 0; DWORD WINAPI ThreadFunc1(PVOID pvParam)InterlockedIncrement(&g_x); return 0; DWORD WINA

4、PI ThreadFunc2(PVOID pvParam) InterlockedIncrement(&g_x); return 0; n必須保證傳遞給這些函數(shù)的變量地址正確地對(duì)齊,必須保證傳遞給這些函數(shù)的變量地址正確地對(duì)齊,否則這些函數(shù)就會(huì)運(yùn)行失敗否則這些函數(shù)就會(huì)運(yùn)行失敗.ninterlocked系列函數(shù)是如何運(yùn)行的呢?系列函數(shù)是如何運(yùn)行的呢?q答案取決于運(yùn)行的是何種答案取決于運(yùn)行的是何種CPU平臺(tái)。對(duì)于平臺(tái)。對(duì)于x86家族的家族的CPU來(lái)說(shuō),互鎖函數(shù)會(huì)對(duì)總線(xiàn)發(fā)出一個(gè)硬件信號(hào),防來(lái)說(shuō),互鎖函數(shù)會(huì)對(duì)總線(xiàn)發(fā)出一個(gè)硬件信號(hào),防止另一個(gè)止另一個(gè)CPU訪(fǎng)問(wèn)同一個(gè)內(nèi)存地址。訪(fǎng)問(wèn)同一個(gè)內(nèi)存地址。2

5、 Win 32 線(xiàn)程同步線(xiàn)程同步n為了解決線(xiàn)程同步問(wèn)題,為了解決線(xiàn)程同步問(wèn)題,win32 API提供了多提供了多種同步控制對(duì)象。包括:種同步控制對(duì)象。包括: 互斥對(duì)象、信號(hào)對(duì)象、事件對(duì)象、互斥對(duì)象、信號(hào)對(duì)象、事件對(duì)象、 排斥區(qū)對(duì)象排斥區(qū)對(duì)象( (關(guān)鍵代碼段關(guān)鍵代碼段) )n在介紹這些對(duì)象之前,必須先介紹在介紹這些對(duì)象之前,必須先介紹內(nèi)核對(duì)象內(nèi)核對(duì)象和和等待函數(shù)等待函數(shù)。大多數(shù)的內(nèi)核對(duì)象都有: signaledsignaled、non-signalednon-signaled兩個(gè)狀態(tài) nWin32 API提供了一組能使線(xiàn)程阻塞其自身執(zhí)行的等待函數(shù)。提供了一組能使線(xiàn)程阻塞其自身執(zhí)行的等待函數(shù)。n等

6、待函數(shù)未返回時(shí),線(xiàn)程處于等待狀態(tài),此時(shí)線(xiàn)程只是消耗很少等待函數(shù)未返回時(shí),線(xiàn)程處于等待狀態(tài),此時(shí)線(xiàn)程只是消耗很少的的CPU時(shí)間。時(shí)間。n使用等待函數(shù)既可以保證線(xiàn)程的同步,又可以提高程序的運(yùn)行效使用等待函數(shù)既可以保證線(xiàn)程的同步,又可以提高程序的運(yùn)行效率。最常用的等待函數(shù)為:率。最常用的等待函數(shù)為:nDWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds )nDWORD WaitForMultipleObjects(DWORD nCount, CONST HANDLE *lpHandles, BOOL bWaitAll, DWOR

7、D dwMilliseconds ) WaitForMultipleObjects可以同時(shí)監(jiān)測(cè)多個(gè)同步對(duì)象??梢酝瑫r(shí)監(jiān)測(cè)多個(gè)同步對(duì)象。 (1 1)互斥對(duì)象)互斥對(duì)象 MutexMutexnMutex對(duì)象的狀態(tài)在它不被任何線(xiàn)程擁有時(shí)才對(duì)象的狀態(tài)在它不被任何線(xiàn)程擁有時(shí)才有信號(hào)。有信號(hào)。nMutex對(duì)象很適合用來(lái)協(xié)調(diào)多個(gè)線(xiàn)程對(duì)共享資對(duì)象很適合用來(lái)協(xié)調(diào)多個(gè)線(xiàn)程對(duì)共享資源的互斥訪(fǎng)問(wèn)。源的互斥訪(fǎng)問(wèn)。n可以按照下列步驟使用該對(duì)象:可以按照下列步驟使用該對(duì)象:nA. 建立全局的互斥對(duì)象,得到句柄建立全局的互斥對(duì)象,得到句柄 HANDLE CreateMutex();nB. 在線(xiàn)程可能產(chǎn)生沖突的區(qū)域前(即訪(fǎng)問(wèn)共

8、在線(xiàn)程可能產(chǎn)生沖突的區(qū)域前(即訪(fǎng)問(wèn)共享資源前)調(diào)用享資源前)調(diào)用WaitForSingleObject()將句柄傳給函將句柄傳給函數(shù),請(qǐng)求占用數(shù),請(qǐng)求占用Mutex對(duì)象:對(duì)象: WaitForSingleObject(hMutex ,5000L);nC. 共享資源訪(fǎng)問(wèn)結(jié)束,釋放對(duì)共享資源訪(fǎng)問(wèn)結(jié)束,釋放對(duì)Mutex對(duì)象的對(duì)象的占用:占用: ReleaseMutex(hMutex);n注意:注意: Mutex對(duì)象在同一時(shí)刻只能被一個(gè)線(xiàn)程占對(duì)象在同一時(shí)刻只能被一個(gè)線(xiàn)程占用,當(dāng)用,當(dāng)Mutex對(duì)象被一個(gè)線(xiàn)程占用時(shí),若另一對(duì)象被一個(gè)線(xiàn)程占用時(shí),若另一個(gè)線(xiàn)程想占用它,則必須等到前一個(gè)線(xiàn)程釋放。個(gè)線(xiàn)程想占用

9、它,則必須等到前一個(gè)線(xiàn)程釋放?;コ鈱?duì)象舉例:互斥對(duì)象舉例:n見(jiàn)見(jiàn)工程工程threads_mutexMultiThread。(模擬。(模擬售票系統(tǒng))售票系統(tǒng))(2 2)信號(hào)對(duì)象)信號(hào)對(duì)象 Semaphoren信號(hào)對(duì)象允許同時(shí)對(duì)多個(gè)線(xiàn)程共享資源進(jìn)行訪(fǎng)問(wèn),在創(chuàng)建對(duì)象時(shí)指定最大可同時(shí)訪(fǎng)問(wèn)的線(xiàn)程數(shù)。當(dāng)一個(gè)線(xiàn)程申請(qǐng)?jiān)L問(wèn)成功后,信號(hào)對(duì)象中的計(jì)數(shù)器減一,調(diào)用ReleaseSemaphore函數(shù)后,信號(hào)對(duì)象中的計(jì)數(shù)器加一。其中,計(jì)數(shù)器值大于或等于,但小于或等于創(chuàng)建時(shí)指定的最大值。如果一個(gè)應(yīng)用在創(chuàng)建一個(gè)信號(hào)對(duì)象時(shí),將其計(jì)數(shù)器的初始值設(shè)為,就阻塞了其他線(xiàn)程,保護(hù)了資源。等初始化完成后,調(diào)用ReleaseSemaph

10、ore函數(shù)將其計(jì)數(shù)器增加至最大值,則可進(jìn)行正常的存取訪(fǎng)問(wèn)。 n可以按照下列步驟使用該對(duì)象:nA. 創(chuàng)建全局的信號(hào)對(duì)象: HANDLE CreateSemaphore(); 或者打開(kāi)一個(gè)信號(hào)對(duì)象: HANDLE OpenSemaphore();nB. 在線(xiàn)程訪(fǎng)問(wèn)共享資源之前調(diào)用 WaitForSingleObject();nC. 共享資源訪(fǎng)問(wèn)完成后,應(yīng)釋放對(duì)信號(hào)對(duì)象的占用:ReleaseSemaphore();(3 3)事件對(duì)象)事件對(duì)象 EventEventn事件對(duì)象(Event)是最簡(jiǎn)單的同步對(duì)象,它包括有信號(hào)和無(wú)信號(hào)兩種狀態(tài)。nA. 創(chuàng)建全局的事件對(duì)象HANDLE CreateEvent(

11、NULL, FALSE, TRUE, NULL)自動(dòng)重置事件 signaledHANDLE CreateEvent(NULL, TRUE, FALSE, NULL)nB. 在線(xiàn)程訪(fǎng)問(wèn)共享資源之前調(diào)用 WaitForSingleObject();nC.重新設(shè)置成有信號(hào)狀態(tài) SetEvent(EVENT_HANDLE ); 手動(dòng)重置事件 non-signaled事件對(duì)象舉例:事件對(duì)象舉例:n見(jiàn)工程threads_Event_CriticalEvent。(模擬售票系統(tǒng))(4 4)排斥區(qū)對(duì)象(關(guān)鍵代碼段)排斥區(qū)對(duì)象(關(guān)鍵代碼段)CriticalSectionn在排斥區(qū)中異步執(zhí)行時(shí),它只能在同一進(jìn)程的線(xiàn)

12、程之間共享在排斥區(qū)中異步執(zhí)行時(shí),它只能在同一進(jìn)程的線(xiàn)程之間共享資源處理。使用排斥區(qū)的方法則使同步管理的效率更高。資源處理。使用排斥區(qū)的方法則使同步管理的效率更高。 nA. 使用時(shí)先定義一個(gè)使用時(shí)先定義一個(gè)CRITICAL_SECTION結(jié)構(gòu)結(jié)構(gòu)的全局排斥區(qū)對(duì)象的全局排斥區(qū)對(duì)象: VOID InitializeCriticalSection(LPCRITICAL_SECTION); nB. 當(dāng)一個(gè)線(xiàn)程使用排斥區(qū)時(shí),調(diào)用函數(shù):當(dāng)一個(gè)線(xiàn)程使用排斥區(qū)時(shí),調(diào)用函數(shù): EnterCriticalSection( ); nC. 當(dāng)要求退出排斥區(qū)時(shí),調(diào)用函數(shù):當(dāng)要求退出排斥區(qū)時(shí),調(diào)用函數(shù): LeaveCrit

13、icalSection( ); /釋放對(duì)排斥區(qū)對(duì)象的占用釋放對(duì)排斥區(qū)對(duì)象的占用. D. 進(jìn)程結(jié)束時(shí),進(jìn)程結(jié)束時(shí),DeleteCriticalSection(&g_csA)刪除排斥刪除排斥區(qū)對(duì)象區(qū)對(duì)象排斥區(qū)對(duì)象(關(guān)鍵代碼段)舉例:排斥區(qū)對(duì)象(關(guān)鍵代碼段)舉例:n見(jiàn)見(jiàn)工程工程threads_Event_CriticalCritical。(模擬售票系統(tǒng))(模擬售票系統(tǒng))3 MFC線(xiàn)程同步n前面我們介紹了Win32 API提供的幾種有關(guān)線(xiàn)程同步的對(duì)象,在MFC類(lèi)庫(kù)中對(duì)這幾個(gè)對(duì)象進(jìn)行了類(lèi)封裝,它們有一個(gè)共同的基類(lèi)CSyncObject,n它們的對(duì)應(yīng)關(guān)系為: Semaphore對(duì)應(yīng)CSemapho

14、re、 Mutex對(duì)應(yīng)CMutex、 Event對(duì)應(yīng)CEvent、 CriticalSection對(duì)應(yīng)CCriticalSection。n另外,MFC對(duì)兩個(gè)等待函數(shù)也進(jìn)行了封裝,即: CSingleLock和CMultiLock。n因四個(gè)對(duì)象用法相似,在這里就以CMutex為例進(jìn)行說(shuō)明: n創(chuàng)建一個(gè)CMutex對(duì)象: CMutex mutex(FALSE,NULL,NULL); 或 CMutex mutex; n當(dāng)各線(xiàn)程要訪(fǎng)問(wèn)共享資源時(shí)使用下面代碼: CSingleLock sl(&mutex); sl.Lock(); if(sl.IsLocked() /對(duì)共享資源進(jìn)行操作. sl.U

15、nlock(); 提示:n如果用戶(hù)的應(yīng)用程序需要多個(gè)任務(wù)同時(shí)進(jìn)行相應(yīng)的處理,則使用多線(xiàn)程是較理想的選擇。n這里,提醒大家注意的是在多線(xiàn)程編程時(shí)要特別小心處理資源共享問(wèn)題以及多線(xiàn)程調(diào)試問(wèn)題。 n多線(xiàn)程編程是一項(xiàng)比較高級(jí)的編程技術(shù),多線(xiàn)程應(yīng)用程序的主要優(yōu)勢(shì)就是可以用盡量少的時(shí)間對(duì)用戶(hù)的要求做出響應(yīng)。大家必須好好掌握。C#多線(xiàn)程概述C#多線(xiàn)程程序設(shè)計(jì)多線(xiàn)程程序設(shè)計(jì)nC#多線(xiàn)程程序使用多線(xiàn)程程序使用.NET類(lèi)庫(kù)類(lèi)庫(kù)Sysrem.Threading的類(lèi)的類(lèi)Thread進(jìn)行:用進(jìn)行:用Tread構(gòu)造函數(shù)建立一個(gè)線(xiàn)程構(gòu)造函數(shù)建立一個(gè)線(xiàn)程t: Thread t=new Thread(new ThreadSta

16、rt(workfunc); 用用Start()啟動(dòng)這個(gè)線(xiàn)程啟動(dòng)這個(gè)線(xiàn)程t: t.Start(); 其中其中workfunc為線(xiàn)程啟動(dòng)的用戶(hù)工作函數(shù),自己編寫(xiě)工作為線(xiàn)程啟動(dòng)的用戶(hù)工作函數(shù),自己編寫(xiě)工作代碼。代碼。Java多線(xiàn)程概述多線(xiàn)程概述建立建立Java多線(xiàn)程多線(xiàn)程1、繼承線(xiàn)程類(lèi)、繼承線(xiàn)程類(lèi)Thread創(chuàng)建新類(lèi):創(chuàng)建新類(lèi): class MyThread extends Thread public void run() /重載重載Tread的的run()方法實(shí)現(xiàn)線(xiàn)程體方法實(shí)現(xiàn)線(xiàn)程體 dowork();/線(xiàn)程的工作代碼線(xiàn)程的工作代碼 Thread t=new MyThread(); /線(xiàn)程類(lèi)的實(shí)例對(duì)象線(xiàn)程類(lèi)的實(shí)例對(duì)象 t.start; /調(diào)用調(diào)用star

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論