程序及執行緒通訊總結

2021-06-04 00:08:55 字數 1606 閱讀 9964

上文我們介紹了如何建立乙個簡單的多執行緒程式,多執行緒之間不可避免的需要進行通訊

。相比於程序間通訊來說,執行緒間通訊無疑是相對比較簡單的。

首先我們來看看最簡單的方法,那就是使用全域性變數(靜態變數也可以)來進行通訊,由於屬於同乙個程序的各個執行緒是處於同乙個程序空間中的,並且它們共享這個程序的各種資源,因此它們都可以毫無障礙的訪問這個程序中的全域性變數。當需要有多個執行緒來訪問乙個全域性變數時,通常我們會在這個全域性變數前加上volatile宣告,來告訴編譯器這個全域性變數是易變的,讓編譯器不要對這個變數進行優化(至於編譯器到底有沒有按照你的要求來對volatile進行處理這個暫且不理)。

下面貼出一段簡單的示例**:

"stdafx.h

""windows.h

""stdio.h

"volatile int threaddata = 0;

void

threadprocess()

"exit sub thread!\n");

int_tmain(

intargc, _tchar

*argv)

"main thread loop finished! \n");

system(

"pause");

return0;

除了全域性變數之外,還有其他的方法,比如利用訊息機制等來實現執行緒間通訊。

執行緒間無需特別的手段進行通訊,因為執行緒間可以共享資料結構,也就是乙個全域性變數可以被兩個執行緒同時使用。不過要注意的是執行緒間需要做好同步,一般用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.訊號燈

執行緒 程序通訊再總結

下面這個部分摘抄自網上,謝謝貢獻的作者。管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。有名管道 namedpipe 有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。訊號量 semophore 訊號...

程序間通訊和執行緒間通訊總結

死鎖的四個必要條件 資源有限 持有等待 不能搶占 迴圈等待條件 死鎖的應對方式 消除獨佔條件 即將資源無限增加或者變為共享 消除保持和請求條件 即乙個程序一次請求其所需要的所有資源,而不是請求一點資源做一點事情,但是這樣太過浪費。消除非搶占條件 即允許對資源進行搶占 消除迴圈等待條件 即產生迴圈等待...

Linux的程序 執行緒通訊方式總結

linux系統中的程序通訊方式主要以下幾種 同一主機上的程序通訊方式 unix程序間通訊方式 包括管道 pipe 有名管道 fifo 和訊號 signal system v程序通訊方式 包括訊號量 semaphore 訊息佇列 message queue 和共享記憶體 shared memory 網...