程序 執行緒間通訊機制

2021-08-04 07:35:26 字數 3321 閱讀 7695

管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序。

有名管道也是半雙工的通訊方式,但是它允許無親緣關係的程序間通訊。

訊號量是乙個計數器,可以用來控制多個程序對共享資源的訪問。它常作為一種鎖機制,防止某程序正在訪問共享資源時,其他程序也訪問該資源。

訊息佇列是由訊息鍊錶,存放在核心中並由訊息佇列識別符號標識。訊息佇列克服了訊號傳遞資訊少、管道只能承載無格式位元組流以及緩衝區大小受限等缺點。

共享記憶體就是對映一段能被其他程序所訪問的記憶體,這段共享記憶體由乙個程序建立,但多個程序都可以訪問。共享記憶體最快的ipc(inter-process communication)方式,它是針對其他程序間通訊方式執行效率低而專門設計的。它往往與其他通訊機制,如訊號量,配合使用,來實現程序間的同步和通訊。

套接字也是一種程序間的通訊機制,與其他通訊機制不同的是,它可用於不同機器間的程序通訊。

資料傳輸:乙個程序需要將它的資料傳送給另乙個程序,傳送的資料量在乙個位元組到幾m位元組之間

共享資料:多個程序想要操作共享資料,乙個程序對共享資料的修改,別的程序應該立即看到

通知事件:乙個程序需要向另乙個或一組程序傳送訊息,通知它們發生了某種事件(如程序終止時需要通知父程序)。

資源共享: 多個程序之間共享同樣的資源。為了做到這一點,需要核心提供鎖和同步機制。

程序控制: 有些程序希望完成控制另乙個程序的執行(如debug程序),此時控制程序希望能夠攔截另一程序的所有陷入和異常,並能夠及時知道它的狀態改變。

互斥鎖:提供了以排它方式阻止資料結構被併發修改的方法

讀寫鎖:允許多個執行緒同時讀共享資料,而對寫操作互斥

條件變數:以原子的方式阻塞程序,知道某個特定條件為真為止。對條件測試是在互斥鎖的保護下進行的。條件變數始終與互斥鎖一起使用

執行緒間通訊的主要目的是用於執行緒同步,所以執行緒沒有像程序通訊中用於資料交換的通訊機制

臨界區(ccriticalsection)

當多個執行緒訪問乙個獨占性共享資源時,可以使用臨界區物件。擁有臨界區的執行緒可以訪問被保護起來的資源或**段,其他執行緒若想訪問,則被掛起,直到擁有臨界區的執行緒放棄臨界區為止。具體應用方式:

1、定義臨界區物件ccriticalsection g_criticalsection;

2、 在訪問共享資源(**或變數)之前,先獲得臨界區物件,g_criticalsection.lock();

3、 訪問共享資源後,則放棄臨界區物件,g_criticalsection.unlock();

事件(cevent)

事件(event)是win32提供的最靈活的執行緒間同步方式,事件可以處於激發狀態(signaled or true)或未激發狀態(unsignal or false)。根據狀態變遷方式的不同,事件可分為兩類:

(1)手動設定:這種物件只可能用程式手動設定,在需要該事件或者事件發生時,採用setevent及resetevent來進行設定。

(2)自動恢復:一旦事件發生並被處理後,自動恢復到沒有事件狀態,不需要再次設定。

使用」事件」機制應注意以下事項:

(1)如果跨程序訪問事件,必須對事件命名,在對事件命名的時候,要注意不要與系統命名空間中的其它全域性命名物件衝突;

(2)事件是否要自動恢復;

(3)事件的初始狀態設定。

由於event物件屬於核心物件,故程序b可以呼叫openevent函式通過物件的名字獲得程序a中event物件的控制代碼,然後將這個控制代碼用於resetevent、setevent和waitformultipleobjects等函式中。此法可以實現乙個程序的執行緒控制另一程序中線程的執行,例如:

handle hevent=openevent(event_all_access,true,"myevent"); 

resetevent(hevent);

全部變數

互斥量(cmutex)

互斥物件和臨界區物件非常相似,只是其允許在程序間使用,而臨界區只限制與同一程序的各個執行緒之間使用,但是更節省資源,更有效率。

訊號量(csemphore)

當需要乙個計數器來限制可以使用某共享資源的執行緒數目時,可以使用「訊號量」物件。csemaphore類物件儲存了對當前訪問某乙個指定資源的執行緒的計數值,該計數值是當前還可以使用該資源的執行緒數目。如果這個計數達到了零,則所有對這個csemaphore類物件所控制的資源的訪問嘗試都被放入到乙個佇列中等待,直到超時或計數值不為零為止。

訊號量是維護0到指定最大值之間的同步物件。訊號量狀態在其計數大於0時是有訊號的,而其計數是0時是無訊號的。訊號量物件在控制上可以支援有限數量共享資源的訪問。

訊號量的特點和用途可用下列幾句話定義:

(1)如果當前資源的數量大於0,則訊號量有效;

(2)如果當前資源數量是0,則訊號量無效;

(3)系統決不允許當前資源的數量為負值;

(4)當前資源數量決不能大於最大資源數量。

建立訊號量

handle createsemaphore (

psecurity_attribute psa,

long linitialcount, //開始時可供使用的資源數

long lmaximumcount, //最大資源數

pctstr pszname);

釋放訊號量

通過呼叫releasesemaphore函式,執行緒就能夠對信標的當前資源數量進行遞增,該函式原型為:

bool winapi releasesemaphore(

handle hsemaphore,

long lreleasecount, //訊號量的當前資源數增加lreleasecount

lplong lppreviouscount

);

開啟訊號量

和其他核心物件一樣,訊號量也可以通過名字跨程序訪問,開啟訊號量的api為:

handle opensemaphore (

dword fdwaccess,

bool binherithandle,

pctstr pszname

);

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

程序間通訊 ipc,interprocess communication 是一組程式設計介面,讓程式設計師能夠協調不同的程序,使之能在乙個作業系統裡同時執行,並相互傳遞 交換資訊。這使得乙個程式能夠在同一時間裡處理許多使用者的要求。因為即使只有乙個使用者發出要求,也可能導致乙個作業系統中多個程序的執...

程序間通訊ipc 執行緒間通訊

程序間通訊 ipc,inter process communication 指至少兩個程序或執行緒間傳送資料或訊號的一些技術或方法。程序是計算機系統分配資源的最小單位 嚴格說來是執行緒 每個程序都有自己的一部分獨立的系統資源,彼此是隔離的。為了能使不同的程序互相訪問資源並進行協調工作,才有了程序間通...

程序間通訊機制(IPC)

1.訊號機制 主要用於向乙個或多個程序發非同步事件訊號,訊號可以通過鍵盤中斷觸發,也可以有程序訪問虛擬記憶體中不存在的位址這樣的錯誤來產生。訊號機制還可以用於shell向它們的子程序傳送作業控制命令。linux使用存貯在每個程序task struct結構中的資訊實現訊號機制,它支援的訊號數受限於處理...