在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到底是怎樣為它們分配記憶體棧空間呢?是 乙個蘿蔔乙個坑 每個執行緒都有自己的棧空間 還是 大樹底下好乘涼 所有的執行緒共享同...