建立多任務模型,並用執行緒來實現
符合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 )
charname;
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()
資料採集執行緒:
voidreceivedata( ) }
記錄執行緒函式:
voidrecord ( )
//將取到的訊息進行記錄處理
//record_message_to_lib();
} }
資料處理執行緒函式:
int process( )
//將取到的訊息進行處理
//process_message_data()
} }
在實現多工系統時,作者曾經做過以下三種實現方法的比較:程序間通訊採用ipc機制,執行緒間通訊採用程序通訊方式ipc,執行緒間通訊採用基於作者開發的訊息佇列。結果表明:利用使用者下的資料區進行執行緒間通訊的速度最快,效率最高,而ipc方式慢。
多執行緒(同步 通訊等)
生產者將產品交給店員,二消費者從店員處取走產品 店員持有的產品數量不超過20,如果超過20叫生產者停一下,少於20就繼續生產 如果店員持有的數量為0,讓消費者稍等下,一有產品就通知消費者 分析 是否有涉及到多執行緒?有,生產者和消費者 是否有涉及到共享資料?有,產品數量,別忘了執行緒安全 是否有涉及...
linux 多執行緒通訊(三)執行緒的同步
同步 當多個執行緒共享相同的記憶體時,需要每乙個執行緒看到相同的試圖,當乙個執行緒修改變數時,其他執行緒也可以讀取或修改這個變數,就需要執行緒的同步,確保他們不會訪問到無效的變數。互斥量 在變數修改時間多於以乙個儲存器訪問週期的處理器結構中,當儲存器的讀和寫這兩個週期交叉時,這種潛在的不一致性就會出...
Linux多執行緒及執行緒同步簡單例項
一 多執行緒基本概念 1.執行緒的基本概念 執行緒就是輕量級的程序 執行緒和建立他的程序共享 段 資料段 執行緒擁有自己的棧 2.在實際應用中,多個執行緒往往會訪問同一資料或資源,為避免執行緒之間相互影響,需要引入互斥機制,而互斥鎖 mutex 是互斥機制中的一種 3.簡單例項 include in...