C++多線程編程學習(1)

來源:互聯網
上載者:User
文章目錄
  • 1、線程的基本概念、線程的基本狀態及狀態之間的關係。
  • 2、線程與進程的區別
  • 3、線程的同步與互斥
  • 4、死結產生的原因以及如何避免死結

1、線程的基本概念、線程的基本狀態及狀態之間的關係。

(1)線程的概念 

-------1) 線程最直接的理解就是“輕量級進程”,它是一個基本的CPU執行單元,也是程式執行流的最小單位,由線程ID、程式計數器、寄存器集合和堆棧組成。 

-------2) 線程是進程中的一個實體,是被系統獨立調度和指派的基本單位。線程自己不擁有系統資源,只擁有一點在運行中必不可少的資源,但它可以與同屬一個進程的其它線程共用進程所擁有的全部資源。

-------3)不同的線程可以執行相同的程式,即同一個服務被不同的使用者調用時,作業系統為它們建立成不同的線程。

-------4)線程是處理機的獨立調度單位,多個線程是可以並發執行的。在單CPU的電腦系統中,各線程可以交替的佔用CPU,在多CPU的電腦系統中,各線程可以同時佔用不同的CPU,若各個CPU同時為一個進程內的各線程服務則可縮短進程的處理周期。

(2)線程的基本狀態

線程也有就緒、阻塞和運行三種狀態。

執行狀態表示線程正在獲得處理機而運行

就緒狀態指線程已具備了各種執行條件,一旦獲得CPU便可執行檔狀態

阻塞狀態指線程在執行中因某事件而受阻,處於暫停執行的狀態。

2、線程與進程的區別

1)調度

在傳統的作業系統中,擁有資源和獨立調度的基本單位都是進程。在引入線程的作業系統中,線程是獨立調度的基本單位,進程是擁有資源的基本單位。在同一進程中,線程的切換不會引起進程切換。在不同的進程中進行線程切換,如從一個進程內的線程切換到另一個進程中的線程時,會引起進程切換。

2)擁有資源

不論是傳統的作業系統還是擁有線程的作業系統,進程都是擁有資源的基本單位,而線程不擁有資源(只有一點必不可少的資源),但線程可以訪問其隸屬進程的系統資源。

3)並發性

在引入線程的作業系統中,不僅進程間可以並發執行,同一進程內的多個線程間也可以並發執行,從而使作業系統具有更好的並發性,提高了系統輸送量。

4)系統開銷

由於建立或撤銷進程時,系統都要為之分配或回收資源,如記憶體空間、IO裝置等,因此作業系統所付出的開銷遠大於建立或撤銷線程時的開銷。類似的,進行進程切換時,涉及當前執行過程CPU環境的儲存及新調度到進程CPU環境的設定,而線程切換隻需要儲存和設定少量的寄存器內容,開銷很小。此外,由於同一進程內的多個線程共用進程的地址空間,因此,這些線程之間的同步與通訊非常容易實現,甚至無需作業系統的幹預。

5)地址空間和其它資源

進程的地址空間相互獨立,同一進程的各線程共用進程的資源,而進程內的線程對其它進程不可見。

6)通訊方面

處理序間通訊(IPC)需要進程同步和互斥手段的輔助,以保證資料的一致性,而線程間可以直接讀/寫進程資料區段(如全域變數)來進行通訊。

3、線程的同步與互斥

線程同步的方法主要有以下四種:

-------1)臨界區(Critical Section):通過臨界區實現多個線程對同一公用資源或一段代碼的串列訪問,速度快,適合控制資料的訪問。    

      保證某一時刻只有一個線程訪問某一資源的簡便方法。任意時刻只允許一個線程對資源的訪問。如果同一時刻由多個線程試圖訪問臨界區,則其中一個線程進入臨界區後,其它線程將會被掛起等待,並一直持續到該線程退出臨界區。當臨界區被釋放後,其它線程可以搶佔,並以此達到原子方式操作共用資源的目的。

      臨界區的兩個原語:EnterCriticalSection() 進入臨界區;LeaveCriticalSection()退出臨界區。

-------2)互斥量(Mutex):通過協調線程共同對一個共用資源的單獨訪問而設計。 

      互斥量跟臨界區很相似,只有擁有互斥對象的線程才具有訪問資源的許可權。由於互斥對象只有一個,因此就決定了同時只有一個線程擁有對資源的存取權限。當前佔據資源的線程在任務處理完成後交付互斥對象,以便其它線程可以擁有該互斥對象實現對資源的控制訪問。互斥量比臨界區複雜,互斥量不僅可以實現同一應用程式的不同線程間的同步,而且可以實現不同程式間線程的對資源的安全共用。

      互斥量包含的幾個操作原語:

          CreateMutex()建立互斥量

          OpenMutex()開啟互斥量

          ReleaseMutex()釋放互斥量

          WaitForMultipleObjects() 等待互斥對象

-------3)訊號量(Semaphores):可以控制有限使用者對同一資源的的訪問而設計;

      訊號量對線程同步的方法與前幾種不同,訊號量允許多個線程同時使用共用資源,這與作業系統中的PV操作相同。它指出了同時訪問共用資源的最大線程數目。它允許多個線程在同一時刻訪問同一資源,但是限制了同一時刻訪問資源的最大線程數目。在用CreateSemaphore()建立訊號量時,要同時指出允許訪問的最大資源基數和當前可用資源計數。一般把當前可用資源計數作為最大資源計數,即每增加一個線程對資源的訪問相應的資源計數就會減一,只要當前可用資源計數是大於0的,就可以發出訊號量訊號。但是當前可用資源減小到小於0時,則說明當前佔用資源的線程數目已經達到最大,不允許線程的繼續進入,此時訊號量也無法發出。當線程處理完資源後,應該離開的同時通過ReleaseSemaphore()使資源計數加1。在任何時候當前可用資源數目不可用大於最大資源數目。

       PV操作是由荷蘭科學家提出的。訊號量S是一個整數,當S大於等於0時,代表可給並發進程使用的資源實體,但S小於零正在等待使用共用資源的數目。

       P操作申請資源:

         (1)S減1

         (2)若S減1後仍大於等於0,則進程繼續;

         (3)若S減1後小於0,則進程被阻塞後放入該訊號相應的隊列中,然後轉入進程調度;

       V操作釋放資源:

        (1)S加1操作;

        (2)若S加1後大於0,則進程繼續執行;

        (3)若S加1小於等於0,則從訊號量的等待隊列中喚醒一個等待進程,然後再返回原進程繼續執行或轉入進程調度。

      訊號量包含的幾個操作原語:

         CreateSemphore()建立一個訊號量;

         OpenSemphore()開啟一個訊號量;

         ReleaseSemaphore()退出一個訊號量;

         WaitForSingleObject()等待一個訊號量

------4)事件(Event):通過通知線程的有一些事件已經發生,從而可以啟動後續的任務執行。

      事件對象也可以通過通知操作的方式保持線程同步,可以實現不同進程中的線程同步操作;

總結:

      1)互斥量與臨界區的作用非常相似。但互斥量是可以命名的,也就是說可以擴進程使用,所以建立互斥所需的資源更多,所以如果為了在進程內部使用的話,可以通過臨界區來提高速度上的優勢,並且可以減少資源的使用。互斥量是跨進程的,一旦被建立就可以通過名字開啟。 

     2)互斥量、訊號量和事件都可以被跨越進程來進行進程同步資料操作,而其他的對象與資料同步操作無關,但對於進程和線程來講,如果進程和線程在運行狀態為無訊號狀態,在退出後為有訊號狀態。所以可以使用WaitForSingleObject來等待進程和線程退出。 

     3)通過互斥量可以指定資源獨佔的方式使用,但如果有下面一種情況,訊號量就無法處理,比如一個使用者購買了一份三個並發訪問許可的資料可系統,可以根據使用者購買的訪問許可數量來決定由多少個線程/進程能同時進行資料庫操作,這時候如果利用互斥量就沒有辦法完成請求,可以使用訊號量。

4、死結產生的原因以及如何避免死結

   

    產生死結的主要原因是

             1)系統資源不足

             2)進程運行推進的順序不合適

             3)資源分派不當

    產生死結的4個必要條件

             1)互斥條件:一個資源每次只能被一個進程使用

             2)請求與保持條件:一個進程因請求資源而被阻塞時,對已獲得的資源保持不放

             3)不剝脫條件:進程已獲得的資源在未使用完之前不被強行剝奪

             4)迴圈等待條件:若干進程之前形成一種頭尾相接的迴圈等待資源關係

    如何避免死結

             在系統設計進程調度等方面注意不讓這四個條件成立,確定資源的合理分配演算法,避免進程永久佔據系統資源。

   

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.