1. 程式人生 > >執行緒互斥和同步(一簡介)

執行緒互斥和同步(一簡介)

執行緒互斥和同步——概念

一:基礎概念

    程序是資源分配的基本單位;執行緒是系統排程的基本單位。平時我們寫的程式都是作為執行緒執行的;程序可以看做是包括一系列執行緒和資源的統稱;一個程序至少包括一個執行緒(主執行緒,進入main函式時產生的);在其中可以建立其它執行緒,也可以不建立。同一程序間的執行緒究竟共享哪些資源呢,而又各自獨享哪些資源呢?

 

共享資源

a.  由於堆是在程序空間中開闢出來的,所以它是理所當然地被共享的;因此new出來的都是共享的(16位平臺上分全域性堆和區域性堆,區域性堆是獨享的)

b. 全域性變數 它是與具體某一函式無關的,所以也與特定執行緒無關;因此也是共享的

c. 靜態變數 雖然對於區域性變數來說,它在程式碼中是“放”在某一函式中的,但是其存放位置和全域性變數一樣,存於堆中開闢的.bss.data段,是共享的

d. 檔案等公用資源  這個是共享的,使用這些公共資源的執行緒必須同步。Win32提供了幾種同步資源的方式,包括訊號、臨界區、事件和互斥體。

獨享的資源有

a. 棧 棧是獨享的

b. 暫存器  這個可能會誤解,因為電腦的暫存器是物理的,每個執行緒去取值難道不一樣嗎?其實執行緒裡存放的是副本,包括程式計數器PC

 

臨界資源

  是指每次僅允許一個程序訪問的資源。屬於臨界資源的硬體有印表機、磁帶機等,軟體有訊息緩衝佇列、變數、陣列、緩衝區等。  諸程序間應採取互斥方式,實現對這種資源的共享。

  每個程序中訪問臨界資源的那段程式碼稱為臨界區。顯然,若能保證諸程序互斥地進入自己的臨界區,便可實現諸程序對臨界資源的互斥訪問。為此,每個程序在進入臨界區之前,應先對欲訪問的臨界資源進行檢查,看它是否正被訪問。如果此刻該臨界資源未被訪問,程序便可進入臨界區對該資源進行訪問,並設定它正被訪問的標誌;如果此刻該臨界資源正被某程序訪問,則本程序不能進入臨界區

二、什麼是執行緒互斥和同步

執行緒之間通訊的兩個基本問題是互斥和同步:

    執行緒同步:是指執行緒之間所具有的一種制約關係,一個執行緒的執行依賴另一個執行緒的訊息,當它沒有得到另一個執行緒的訊息時應等待,直到訊息到達時才被喚醒。

    執行緒互斥是指對於共享的作業系統資源(指的是廣義的"資源",而不是Windows.res檔案,譬如全域性變數就是一種共享資源),在各執行緒訪問時的排它性。當有若干個執行緒都要使用某一共享資源時,任何時刻最多隻允許一個執行緒去使用,其它要使用該資源的執行緒必須等待,直到佔用資源者釋放該資源。

  執行緒互斥是一種特殊的執行緒同步。實際上,互斥和同步對應著執行緒間通訊發生的兩種情況:

(1)當有多個執行緒訪問共享資源而不使資源被破壞時;

(2)當一個執行緒需要將某個任務已經完成的情況通知另外一個或多個執行緒時。

 

從大的方面講,執行緒的同步可分使用者模式的執行緒同步和核心物件的執行緒同步兩大類。使用者模式中執行緒的同步方法主要有原子訪問和臨界區等方法。其特點是同步速度特別快,適合於對執行緒執行速度有嚴格要求的場合。