轉 Linux多執行緒通訊及同步

2021-07-02 02:50:58 字數 2331 閱讀 3426

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

符合posix標準的unix作業系統提供了執行緒的控制函式,如:執行緒的建立和終止、執行緒之間的互斥、執行緒之間的同步等。利用這些系統函式可以成功地模擬訊息佇列,來實現執行緒間資料共享和同步,以完成多工的實時性。為成功地描述執行緒間資料共享和同步,以下列任務模型為例。 

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

#define maxqueue 30 

typedef struct mq_attrib mq_attrib,mq_attribstruct,mq_attrib_t; 

mq_attrib_t msqueue[maxqueue]; 

資料結構定義了訊息佇列的名字name,最大訊息個數maxelements,單個訊息長度elementlength,當前訊息個數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方式慢。 

多執行緒(同步 通訊等)

生產者將產品交給店員,二消費者從店員處取走產品 店員持有的產品數量不超過20,如果超過20叫生產者停一下,少於20就繼續生產 如果店員持有的數量為0,讓消費者稍等下,一有產品就通知消費者 分析 是否有涉及到多執行緒?有,生產者和消費者 是否有涉及到共享資料?有,產品數量,別忘了執行緒安全 是否有涉及...

linux 多執行緒通訊(三)執行緒的同步

同步 當多個執行緒共享相同的記憶體時,需要每乙個執行緒看到相同的試圖,當乙個執行緒修改變數時,其他執行緒也可以讀取或修改這個變數,就需要執行緒的同步,確保他們不會訪問到無效的變數。互斥量 在變數修改時間多於以乙個儲存器訪問週期的處理器結構中,當儲存器的讀和寫這兩個週期交叉時,這種潛在的不一致性就會出...

Linux多執行緒及執行緒同步簡單例項

一 多執行緒基本概念 1.執行緒的基本概念 執行緒就是輕量級的程序 執行緒和建立他的程序共享 段 資料段 執行緒擁有自己的棧 2.在實際應用中,多個執行緒往往會訪問同一資料或資源,為避免執行緒之間相互影響,需要引入互斥機制,而互斥鎖 mutex 是互斥機制中的一種 3.簡單例項 include in...