??? 首先我們來看看最簡單的方法,那就是使用全局變量(靜態變量也可以)來進行通信,由于屬于同一個進程的各個線程是處于同一個進程空間中的,并且它們共享這個進程的各種資源,因此它們都可以毫無障礙的訪問這個進程中的全局變量。當需要有多個線程來訪問一個全局變量時,通常我們會在這個全局變量前加上volatile聲明,來告訴編譯器這個全局變量是易變的,讓編譯器不要對這個變量進行優化(至于編譯器到底有沒有按照你的要求來對volatile進行處理這個暫且不理)。
??? 下面貼出一段簡單的示例代碼:
? ? |
??? 除了全局變量之外,還有其他的方法,比如利用消息機制等來實現線程間通信。
?
線程間無需特別的手段進行通信,因為線程間可以共享數據結構,也就是一個全局變量可以被兩個線程同時使用。不過要注意的是線程間需要做好同步,一般用mutex。
?
一、互斥與同步
1.互斥:是指某一資源同時只允許一個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。
2.同步:是指在互斥的基礎上(大多數情況),通過其它機制實現訪問者對資源的有序訪問。在大多數情況下,同步已經實現了互斥,特別是所有寫入資源的情況必定是互斥的。少數情況是指可以允許多個訪問者同時訪問資源.
3.同步是一種更為復雜的互斥,而互斥是一種特殊的同步.
二、通信與同步
進程間同步本身也是一種進程間通信(因為涉及信息的交換),當然也是一種原始的進程間通信,但同時又是更高級的進程間通信機制的基石。
對線程亦然.
三、臨界區(Critical section)與互斥體(Mutex)的區別
1、臨界區只能用于對象在同一進程里線程間的互斥訪問;互斥體可以用于對象進程間或線程間的互斥訪問。
2、臨界區是非內核對象,只在用戶態進行鎖操作,速度快;互斥體是內核對象,在核心態進行鎖操作,速度慢。
3、臨界區和互斥體在Windows平臺都下可用;Linux下只有互斥體可用。
四、linux IPC
1.經典IPC:
(1)管道、命名管道?????? //最基本最常用
(2)消息隊列、信號量、共享存儲
//分為Posix IPC和System V IPC,共享存儲是運行在同一臺機器上的進程間通信最快的方式
2高級IPC: 流管道、命名流管道
(以上是限于同一臺主機的各個進程間的IPC)
3.支持不同主機上各個進程的IPC:套接口、流
五、線程間通信機制:
1.互斥鎖
2.條件變量
3.讀寫鎖
4.信號燈