天天看點

線程間的通信、同步方式與程序間通信方式

轉載來自:總結的很到位

1、線程間的通信方式

● 使用全局變量

主要由于多個線程可能更改全局變量,是以全局變量最好聲明為volatile

● 使用消息實作通信

在Windows程式設計中,每一個線程都可以擁有自己的消息隊列(UI線程預設自帶消息隊列和消息循環,工作線程需要手動實作消息循環),是以可以采用消息進行線程間通信sendMessage,postMessage。

1)定義消息#define WM_THREAD_SENDMSG=WM_USER+20;

2)添加消息函數聲明afx_msg int OnTSendmsg();

3)添加消息映射ON_MESSAGE(WM_THREAD_SENDMSG,OnTSM)

4)添加OnTSM()的實作函數;

5)線上程函數中添加PostMessage消息Post函數

● 使用事件CEvent類實作線程間通信

Event對象有兩種狀态:有信号和無信号,線程可以監視處于有信号狀态的事件,以便在适當的時候執行對事件的操作。

1)建立一個CEvent類的對象:CEvent threadStart;它預設處在未通信狀态;

2)threadStart.SetEvent();使其處于通信狀态;

3)調用WaitForSingleObject()來監視CEvent對象

2、線程間的同步方式

各個線程可以通路程序中的公共變量,資源,是以使用多線程的過程中需要注意的問題是如何防止兩個或兩個以上的線程同時通路同一個資料,以免破壞資料的完整性。資料之間的互相制約包括

1、直接制約關系,即一個線程的處理結果,為另一個線程的輸入,是以線程之間直接制約着,這種關系可以稱之為同步關系

2、間接制約關系,即兩個線程需要通路同一資源,該資源在同一時刻隻能被一個線程通路,這種關系稱之為線程間對資源的互斥通路,某種意義上說互斥是一種制約關系更小的同步

線程間的同步方式有四種

● 臨界區

臨界區對應着一個CcriticalSection對象,當線程需要通路保護資料時,調用EnterCriticalSection函數;當對保護資料的操作完成之後,調用LeaveCriticalSection函數釋放對臨界區對象的擁有權,以使另一個線程可以奪取臨界區對象并通路受保護的資料。

PS:關鍵段對象會記錄擁有該對象的線程句柄即其具有“線程所有權”概念,即進入代碼段的線程在leave之前,可以重複進入關鍵代碼區域。是以關鍵段可以用于線程間的互斥,但不可以用于同步(同步需要在一個線程進入,在另一個線程leave)

● 互斥量

互斥與臨界區很相似,但是使用時相對複雜一些(互斥量為核心對象),不僅可以在同一應用程式的線程間實作同步,還可以在不同的程序間實作同步,進而實作資源的安全共享。

PS:1、互斥量由于也有線程所有權的概念,故也隻能進行線程間的資源互斥通路,不能由于線程同步;

2、由于互斥量是核心對象,是以其可以進行程序間通信,同時還具有一個很好的特性,就是在程序間通信時完美的解決了”遺棄”問題

● 信号量

信号量的用法和互斥的用法很相似,不同的是它可以同一時刻允許多個線程通路同一個資源,PV操作

PS:事件可以完美解決線程間的同步問題,同時信号量也屬于核心對象,可用于程序間的通信

● 事件

事件分為手動置位事件和自動置位事件。事件Event内部它包含一個使用計數(所有核心對象都有),一個布爾值表示是手動置位事件還是自動置位事件,另一個布爾值用來表示事件有無觸發。由SetEvent()來觸發,由ResetEvent()來設成未觸發。

PS:事件是核心對象,可以解決線程間同步問題,是以也能解決互斥問題

3、程序間通信方式

程序間通信又稱IPC(Inter-Process Communication),指多個程序之間互相通信,交換資訊的方法。根據程序通信時資訊量大小的不同,可以将程序通信劃分為兩大類型:

1、低級通信,控制資訊的通信(主要用于程序之間的同步,互斥,終止和挂起等等控制資訊的傳遞)

2、進階通信,大批資料資訊的通信(主要用于程序間資料塊資料的交換和共享,常見的進階通信有管道,消息隊列,共享記憶體等).

管道( pipe ):管道是一種半雙工的通信方式,資料隻能單向流動,而且隻能在具有親緣關系的程序間使用。程序的親緣關系通常是指父子程序關系。

有名管道 (named pipe) : 有名管道也是半雙工的通信方式,但是它允許無親緣關系程序間的通信。

信号量( semophore ) : 信号量是一個計數器,可以用來控制多個程序對共享資源的通路。不是用于交換大批資料,而用于多線程之間的同步.常作為一種鎖機制,防止某程序在通路資源時其它程序也通路該資源。是以,主要作為程序間以及同一程序内不同線程之間的同步手段。

消息隊列( message queue ) : 消息隊列是由消息的連結清單,存放在核心中并由消息隊列辨別符辨別。消息隊列克服了信号傳遞資訊少、管道隻能承載無格式位元組流以及緩沖區大小受限等缺點。

信号 ( signal ) : 信号是一種比較複雜的通信方式,用于通知接收程序某個事件已經發生。

● [共享記憶體( shared memory )] :共享記憶體就是映射一段能被其他程序所通路的記憶體,這段共享記憶體由一個程序建立,但多個程序都可以通路。共享記憶體是最快的 IPC 方式,它是針對其他程序間通信方式運作效率低而專門設計的。它往往與其他通信機制,如信号兩,配合使用,來實作程序間的同步和通信。

套接字( socket ) : 套解口也是一種程序間通信機制,與其他通信機制不同的是,它可用于不同機器間的程序通信。

繼續閱讀