UNIX多執行緒資料共享與執行緒同步

2021-06-15 21:46:03 字數 2712 閱讀 3217

在unix中,乙個程序讓另外實體進行某項事務而採取的操作為fork的乙個子程序,子進 

程只是將父程序的資料區拷貝乙份到自己的資料區。在符合posix標準的unix作業系統下 

,同乙個程序的執行緒之間共享程序指令、大多數資料(執行緒私有資料除外)、訊號處理 

方式、程序執行環境等。由於執行緒共享程序的全域性變數,因此可以採用使用者自己編寫的 

訊息佇列來實現資料的共享。 

建立多任務模型,並用執行緒來實現 

符合posix標準的unix作業系統提供了執行緒的控制函式,如:執行緒的建立和終止、執行緒之 

間的互斥、執行緒之間的同步等。利用這些系統函式可以成功地模擬訊息佇列,來實現線 

程間資料共享和同步,以完成多工的實時性。為成功地描述執行緒間資料共享和同步, 

以下列任務模型為例。 

首先建立訊息佇列屬性資料結構 

#define maxqueue 30 

typedef struct mq_attrib mq_attrib,mq_attribstruct,mq_attrib_t; 

mq_attrib_t msqueue[maxqueue]; 

資料結構定義了訊息佇列的名字name,最大訊息個數maxelements,單個訊息長度eleme 

ntlength,當前訊息個數curelementnum,存放訊息的緩衝區buff,保護緩衝區鎖mutex 

_buff,執行緒同步條件變數cond,保護執行緒同步條件變數鎖mutex_cond。 

訊息佇列的建立 

依據此資料結構進行訊息佇列的建立,函式為msqueue_create(引數解釋:name訊息隊 

列名,maxnum訊息的最大個數,length單個訊息的長度)。 

int msqueue_create( name, maxnum, length ) 

char name; 

int maxnum,length; 

應用訊息佇列進行訊息的傳送和接收 

傳送訊息到訊息佇列: 

訊息佇列的傳送和接收是在不同的執行緒中進行的。首先介紹傳送訊息到訊息佇列的函式 

: int msqueue_send ( id, buff, length ) 

int id, length; 

caddr_t buff; 

return length; 

} 從訊息佇列中接收訊息: 

訊息佇列的接收函式 msqueue_receive,其引數:id為訊息佇列陣列的索引號,buff為 

訊息內容,length為訊息長度。 

int msqueue_receive ( id, buff, length ) 

int id, length; 

caddr_t buff; 

//取訊息前,鎖住訊息佇列緩衝區,以免其他執行緒存放或取訊息 

pthread_mutex_lock ( &&msqueue[id]->mutex_buff ); 

//為符合訊息佇列fifo特性,取出訊息後,進行訊息佇列的調整 

temp = 

malloc((msqueue[id]->curelementnum-1) 

msqueue[id]-elementlength ); 

bcopy ( &&msqueue[id]->buff[0], buff, msqueue[id]->elementlength ); 

msqueue[id]->curelementnum --; 

bcopy ( &&msqueue[id]->buff[msqueue[id]->elementlength], temp, 

msqueue[id]->elementlength 

msqueue[id]->curelementnum); 

bcopy ( temp, &&msqueue[id]->buff[0], 

msqueue[id]->elementlength 

msqueue[id]->curelementnum); 

free ( temp ); 

//解除緩衝區鎖 

pthread_mutex_unlock ( &&msqueue[id]->mutex_buff ); 

return length; 

} 多任務模型的實現 

實現多工執行緒間的資料共享。 

首先在main主函式中建立訊息佇列和執行緒: 

//定義全域性變數 

int msqueue_record, msqueue_process; 

void main() 

資料採集執行緒: 

void receivedata( )  } 

記錄執行緒函式: 

void record ( ) 

//將取到的訊息進行記錄處理 

//record_message_to_lib(); 

} } 

資料處理執行緒函式: 

int process( ) 

//將取到的訊息進行處理 

//process_message_data() 

} } 

在實現多工系統時,作者曾經做過以下三種實現方法的比較:程序間通訊採用ipc機制 

,執行緒間通訊採用程序通訊方式ipc,執行緒間通訊採用基於作者開發的訊息佇列。結果表 

明:利用使用者下的資料區進行執行緒間通訊的速度最快,效率最高,而ipc方式慢。(作者 

****:[email protected]) 

-- 

多執行緒 資料共享

package thread 需求 簡單的買票程式 需多個視窗同時買票,實現資料共享 實現方式和繼承方式有什麼區別?實現方式避免了單繼承的侷限性。具體步驟 1.定義類實現runnable介面 2.覆蓋runnable介面中的run方法 3.通過thread類建立執行緒物件 4.將runnable介面...

Unix 多執行緒

unix 執行緒 先來介紹執行緒的最基本操作 由淺入深 執行緒建立 pthread t threadid 執行緒的id儲存型別 型別為unsuigned long int int pthread create pthread t,執行緒的唯一標識id const pthread attr t 優先順...

執行緒系列03,多執行緒共享資料,多執行緒不共享資料

多執行緒程式設計,有時希望每個執行緒的資料相互隔離互不影響,有時卻希望執行緒間能共享資料,並保持同步。本篇體驗多執行緒共享和不共享資料。多執行緒不共享資料 對於多執行緒,clr到底是怎樣為它們分配記憶體棧空間呢?是 乙個蘿蔔乙個坑 每個執行緒都有自己的棧空間 還是 大樹底下好乘涼 所有的執行緒共享同...