C++多線程通信:互斥與同步


在一個多線程的應用程序中,所有線程共享進程資源,協同工作。所以,線程之間的通信是編寫多線程應用的必不可少的環節。線程之間的通信包括互斥、同步等,它是多線程設計中最難控制的部分,也是關鍵部分。

1、線程間的互斥(a執行時b不能執行)

(1) 臨界區
  在一個多線程的應用程序中,可能存在這樣的危險:一個線程以某種其他線程不可預料的方式修改資源。
  例如兩個線程都對同一個文件進行讀寫,兩個線程都在進行繪圖,一個線程正在使用一段內存而另一個線程卻正在修改這段內存的值等,都可能出現不可預料的結果。
  可以把不允許多個線程交叉運行的一段程序稱爲臨界區。它是由於多個線程共享公用數據或公用變量而引起的。
  臨界區也被稱爲:訪問公用數據的那段程序。

(2) 互斥
  爲使多個線程在進入自己的臨界區時不出現問題,需要實現線程的互斥運行。它應滿足:
   ·各線程平等,都可隨時進入臨界區。
   ·一個不在臨界區執行的線程,不可以阻止其他線程進入臨界區。
   ·當一個線程正在臨界區內執行時,必須阻止其他線程進入臨界區。
   ·多個線程申請進入臨界區時,只能允許一個線程進入。
   ·一個申請進入臨界區的線程,應該能在有限時間內進入,不會發生死鎖。

(3) 臨界區類
  MFC定義了臨界區封裝類CCriticalSection,可以比較方便的實現線程間的互斥。
  首先定義一個CCriticalSection類對象,該對象通常應被定義爲全局變量,以便跨線程使用。
  當線程要進入臨界區時,調用其成員函數Lock()。若臨界區空閒,該函數將鎖定臨界區;若臨界區已經被鎖定,該函數將被阻塞(不耗費機時),直至臨界區解鎖。
  當線程要退出臨界區時,調用其成員函數Unlock()解鎖,以便其他線程可以進入臨界區。

使用臨界區,實現線程互斥。

2、線程間的同步(b執行的前提是a執行完畢)

有時一個線程的執行條件是另一個線程的執行結果,所以只有等待另一個線程完成某項操作後,該線程纔可繼續執行。例如計算線程和打印線程。
  這種由於線程間的功能邏輯關係引起的,稱爲線程間的直接制約。而由於共享資源引起的線程執行速度的制約,稱爲間接制約。
  存在直接制約關係的一個線程可以在另一個線程的執行條件滿足後,給對方發送相應消息或信號。這樣,被制約的線程可以在條件不滿足時處於阻塞狀態,條件滿足後,被對方喚醒繼續工作。
  這就是線程間的同步方式。

等待函數和事件對象、互斥對象、信號量對象等一起使用,實現線程同步。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章