Windows下多線程同步機制_第1頁
Windows下多線程同步機制_第2頁
Windows下多線程同步機制_第3頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、多線程同步機制Critical section (臨界區(qū))用來實現(xiàn)排他性占有”。適用范圍是單一進程的各線程之間。它是:一個局部性對象,不是一個核心對象??焖俣行?。不能夠同時有一個以上的critical section被等待。無法偵測是否已被某個線程放棄。MutexMutex是一個核心對象,可以在不同的線程之間實現(xiàn)排他性占有,甚至幾十那些現(xiàn)成分屬不同進程。它是:一個核心對象。如果擁有mutex的那個線程結束,則會產生一個abandoned錯誤信息。可以使用Wait.。等待一個mutex??梢跃呙?,因此可以被其他進程開啟。只能被擁有它的那個線程釋放released)。SemaphoreSema

2、phore被用來追蹤有限的資源。它是:一個核心對象。沒有擁有者。可以具名,因此可以被其他進程開啟。可以被任何一個線程釋放(released)。Event ObjectEvent object通常使用于overlapped l/Q或用來設計某些自定義的同步對象。它是:一個核心對象。完全在程序掌控之下。適用于設計新的同步對象?!耙筇K醒”的請求并不會被儲存起來,可能會遺失掉。可以具名,因此可以被其他進程開啟。Interlocked Variable如果lnterlocked.()函數(shù)被使用于所謂的spin-lock,那么他們只是一種同步機制。所謠pin-lock是一種busy loop被預期在極短

3、時間內執(zhí)行,所以有最小的額外負擔overhead)。系統(tǒng)核心偶爾會使用他們。除此之外interlocked variables主要用于引用技術。他們:允許對4字節(jié)的數(shù)值有些基本的同步操作,不需動用到ritical section或mutex之類。在SMP (Symmetric Multi-Processors操作系統(tǒng)中亦可有效運作。/有關多線程的一些技術問題:1、何時使用多線程?2、線程如何同步?3、線程之間如何通訊?4、進程之間如何通訊?先來回答第一個問題,線程實際主要應用于四個主要領域,當然各個領域之間不是絕對孤立的,他們有可能是重疊的,但是每個程序應該 都可以歸于某個領域:1、offlo

4、ading time-consuming task由輔助線程來執(zhí)行耗時計算,而使GUI有更好的反應。我想這應該是我們考慮使用線程最多的一種 情況吧。2、 Scalability。服務器軟件最??紤]的問題,在程序中產生多個線程,每個線程做一份小的工作,使每個U都忙碌,使CPU(一般是 多個)有最佳的使用率,達到負載的均衡,這比較復雜,我想以后再討論這個問題。3、Fair-share resource allocation當你向一個負荷沉重的服務器發(fā)出請求,多少時間才能獲得服務。一個服務器不能同時為太多的請求 服務,必須有一個請求的最大個數(shù),而且有時候對某些請求要優(yōu)先處理,這是線程優(yōu)先級干的活了。

5、4、Simulations線程用于仿真測試。我把主要的目光放在第一個領域,因為它正是我想要的。第二和第三個領域比較有意思,但是目前不在我的研究時間表中。線程的同步機制:1、Event用事件(Event)來同步線程是最具彈性的了。一個事件有兩種狀態(tài):激發(fā)狀態(tài)和未激發(fā)狀態(tài)也稱有信號狀態(tài)和無信號狀態(tài)。事件又分兩 種類型:手動重置事件和自動重置事件。手動重置事件被設置為激發(fā)狀態(tài)后,會喚醒所有等待的線程,而且一直保持為激發(fā)狀態(tài),直到程序重新把 它設置為未激發(fā)狀態(tài)。自動重置事件被設置為激發(fā)狀態(tài)后,會喚“一個”等待中的線程,然后自動恢復為未激發(fā)狀態(tài)。所以用自動重置事件來同步 兩個線程比較理想。MFC中對應的

6、類為CEvent.。CEvent的構造函數(shù)默認創(chuàng)建一個自動重置的事件,而且處于未激發(fā)狀態(tài)。共有三個函數(shù)來改變 事件的狀態(tài):SetEvent,ResetEvent和PulseEvent用事件來同步線程是一種比較理想的做法,但在實際的使用過程中要注意的是,對自動重置事件 調用SetEvent和PulseEvent有可能會引起死鎖,必須小心。2、Critical Section使用臨界區(qū)域的第一個忠告就是不要長時間鎖住一份資源。這里的長時間是相對的,視不同程序而定。對一些控制軟件來說,可能是數(shù)毫 秒,但是對另外一些程序來說,可以長達數(shù)分鐘。但進入臨界區(qū)后必須盡快地離開,釋放資源。如果不釋放的話,會如

7、何?答案是不會怎樣。如果 是主線程(GUI線程)要進入一個沒有被釋放的臨界區(qū),呵呵,程序就會掛了!臨界區(qū)域的一個缺點就Critical Section不是一個核心對象,無 法獲知進入臨界區(qū)的線程是生是死,如果進入臨界區(qū)的線程掛了,沒有釋放臨界資源,系統(tǒng)無法獲知,而且沒有辦法釋放該臨界資源。這個缺點在 互斥器(Mutex沖得到了彌補tritical Section在 MFC 中的相應實現(xiàn)類是CcriticalSectionCcriticalSection:: Lock()進入臨界區(qū),CcriticalSection : UnLock()離開臨界區(qū)。3、Mutex互斥器的功能和臨界區(qū)域很相似。區(qū)別

8、是:Mutex所花費的時間比Critical Section多的多,但是Mutex是核心對象(Event、Semaphore 也是),可以跨進程使用,而且等待一個被鎖住的Mutex可以設定TIMEOUT,不會像Critical Section那樣無法得知臨界區(qū)域的情況,而一直死等。 MFC中的對應類為CMutex。Win32函數(shù)有:創(chuàng)建互斥體CreateMutex(),打開互斥體OpenMutex(),釋放互斥體ReleaseMutex(t Mutex的擁 有權并非屬于那個產生它的線程,而是最后那個對此Mutex進行等待操作(WaitForSingleObject等等)并且尚未進行Releas

9、eMutex (臊作的線程。 線程擁有Mutex就好像進入Critical Section一樣,一次只能有一個線程擁有該Mutex。如果一個擁有Mutex的線程在返回之前沒有調用 ReleaseMutex(),那么這個Mutex就被舍棄了,但是當其他線程等待WaitForSingleObject等)這個Mutex時,仍能返回,并得到一個 WAIT_ABANDONED_O返回值。能夠知道一 個Mutex被舍棄是Mutex特有的。4、Semaphore信號量是最具歷史的同步機制。信號量是解訓roducer/consumer問題的關鍵要素。對應的MFC類是Csemaphore。Win32函數(shù)Crea

10、teSemaphor()用來產生信號量JReleaseSemaphor()用來解除鎖定Semaphore的現(xiàn)值代表的意義是目前可用的資源數(shù)如果Semaphore 的現(xiàn)值為1,表示還有一個鎖定動作可以成功如果現(xiàn)值為5,就表示還有五個鎖定動作可以成功當調用Wait.等函數(shù)要求鎖定,如果Semaphore 現(xiàn)值不為0, Wait.馬上返回,資源數(shù)減1。當調用ReleaseSemaphore ()資源數(shù)加1,當時不會超過初始設定的資源總數(shù)。線程之間的通訊:線程常常要將數(shù)據(jù)傳遞給另外一個線程.Worker線程可能需要告訴別人說它的工作完成了,GUI線程則可能需要交給Worker線程一件新的工作。通過Po

11、stThreadMessage(),可以將消息傳遞給目標線程,當然目標線程必須有消息隊列。以消息當作通訊方式,比起標準技術如使用 全局變量等,有很大的好處。如果對象是同一進程中的線程,可以發(fā)送自定義消息,傳遞數(shù)據(jù)給目標線程,如果是線程在不同的進程中,就涉及進 程之間的通訊了。下面將會講到。進程之間的通訊:當線程分屬于不同進程,也就是分駐在不同的地址空間時,它們之間的通訊需要跨越地址空間的邊界,便得采取一些與同一進程中不同線 程間通訊不同的方法。1、Windows專門定義了一個消息:WM_COPYDATA用來在線程之間搬移數(shù)據(jù),一一不管兩個線程是否同屬于一個進程。同時接受這個 消息的線程必須有一

12、個窗口,即必須是JI線程。WM_COPYDATA必須由SendMessage ()來發(fā)送,不能由PostMessage ()等來發(fā)送,這是 由待發(fā)送數(shù)據(jù)緩沖區(qū)的生命期決定的,出于安全的需要。2、WM_COPYDATA效率上面不是太高,如果要求高效率,可以考慮使用共享內存Shared Memory)。使用共享內存要做的是:設定 一塊內存共享區(qū)域;使用共享內存;同步處理共享內存。第一步:設定一塊內存共享區(qū)域。首先,CreateFileMappingO產生一個file-mapping核心對象,并指定共享區(qū)域的大小MapViewOfFile()獲得一個指針指向可用的內存。如果是C/S模式,由Serve

13、r端來產生file-mapping,那么Client端使用OpenFileMapping (),然后調用 MapViewOfFile()。第二步:使用共享內存。共享內存指針的使用是一件比較麻煩的事,我們需要借助ased屬性,允許指針被定義為從某一點開始起算的32位偏移值。第三步:清理。UnmapViewOfFile ()交出由 MapViewOfFile ()獲得的指針,CloseHandle ()交出file-mapping核心對象的handle。第四步:同步處理??梢越柚鶰utex來進行同步處理。3、IPCAnonymous Pipes Anonymous Pipes只被使用于點對點通訊。當一個進程產生另一個進程時,這是最有用的一種通訊方式。Named Pipes Named Pipes可以是單向,也可以是

溫馨提示

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

評論

0/150

提交評論