消息隊列和管道相比,至少有以下幾個特點:
(1)消息隊列是雙向、雙工的。
(2)如果進程數量較多,要互相通信,如果采用管道的話,要創建很多個管道文件。
(3)消息隊列先天就是“異步”操作,例如A進程丟進去,B進程再讀出來。A丟進去後,A還可以做其他事。不用管B什麼時候去讀。
例如:
消息發送函數
int SendMSG(int mqid,long mtype,std::string _msg)
{
struct UMMessage msg;
strcpy(msg.mtext,_msg.data());
msg.mtype=mtype;
msgsnd(mqid,&msg,strlen(msg.mtext)+1,0);
return 1;
}
(4)消息的讀取操作是阻塞方式的,在多線程編程裡,相當的省事
例如:
我們啟用一個專門的線程來接收消息
void *pthread_MsgHandle(void *arg) {
int mqid = *((int *) arg);
struct UMMessage msg;
while (1) {
//接收消息,根據 KB_MSG 過濾
int ret = msgrcv(mqid, &msg, MSG_TXT_LEN, KB_MSG, 0);
if (ret > 0) {
//處理消息
MessageProcessing(mqid, msg.mtext);
}
}
return (void*) (1);
}
那麼現在進入正題,談談需求。 假設現在有6個進程,相互之間要互相通信。
進程名稱依次是:A、B、C、D、E、F
例如:A要發送消息給B、C、D
B要發送消息給D、E、F、A
C要發送消息給D、E、F
。。。。。等等。。。。 可能性實在太多。。。
我們現在用消息隊列就是要解決這個問題。
問題看上去很難,實際上只要好好思考,就發現用消息隊列很簡單。
怎麼思考呢?
首先,要創建一個消息隊列。
然後做好消息接收【通道】定義。
例如:
#define CH_A 1
#define CH_B 2
#define CH_C 3
#define CH_D 4
#define CH_E 5
#define CH_F 6
總之你有多少個進程要共用這個消息隊列,你就定義多少個。