詳解boost庫中的Message Queue

2021-09-12 15:03:43 字數 2387 閱讀 9029

message queue(後文簡寫成mq或訊息佇列)是boost庫中用來封裝程序間通訊的一種實現,同一臺機器上的程序或執行緒可以通過訊息佇列來進行通迅。訊息佇列中的訊息由優先順序、訊息長度、訊息資料三部分組成。這裡需要注意的事,mq只是簡單的將要傳送的資料在記憶體中進行拷貝,所以我們在傳送複雜結構或物件時,我們需要將其序列化後再傳送,接收端接收時要反序列化,也就是說我們要自己去定義區分一條訊息(就是自定義網路通迅協議)。在mq中,我們可以使用三模式去傳送和接收訊息:

阻塞:在傳送訊息時,若訊息佇列滿了,那麼傳送介面將會阻塞直到佇列沒有滿。在接收訊息時,若隊列為空,那麼接收介面也會阻塞直到佇列不空。超時:使用者可以自定義超時時間,在超時時間到了,那麼傳送介面或接收介面都會返回,無論佇列滿或空try:在隊列為空或滿時,都能立即返回

mq使用命名的共享記憶體來實現程序間通訊。共享記憶體換句話來說,就是使用者可以指定乙個名稱來建立一塊共享記憶體,然後像打乙個檔案一樣去開啟這塊共享記憶體,同樣別的程序也可以根據這個名稱來開啟這塊共享記憶體,這樣乙個程序向共享記憶體中寫,另乙個程序就可以從共享記憶體中讀。這裡兩個程序的讀寫就涉及到同步問題。另外,在建立乙個mq時,我們需要指定mq的最大訊息數量以及訊息的最大size。

//create a message_queue. if the queue   

//exists throws an exception   

message_queue mq  

(create_only         //only create   

,"message_queue"     //name   

,100                 //max message number   

,100                 //max message size   

);  

using boost::interprocess;  

//creates or opens a message_queue. if the queue   

//does not exist creates it, otherwise opens it.   

//message number and size are ignored if the queue   

//is opened   

message_queue mq  

(open_or_create      //open or create   

,"message_queue"     //name   

,100                 //max message number   

,100                 //max message size   

);  

using boost::interprocess;  

//opens a message_queue. if the queue   

//does not exist throws an exception.   

message_queue mq  

(open_only           //only open   

,"message_queue"     //name   

);  

使用message_queue::remove("message_queue");來移除乙個指定的訊息佇列。

接下來,我們看乙個使用訊息佇列的生產者與訊息者的例子。第乙個程序做為生產者,第二個程序做為消費者。

生產者程序:

[cpp]view plain

copy

print?

#include 

#include 

#include 

using namespace boost::interprocess;  

int main ()  

}  catch(interprocess_exception &ex)  

return 0;  

}

消費者程序:
[cpp]view plain

copy

print?

#include 

#include 

#include 

using namespace boost::interprocess;  

int main ()  

}  catch(interprocess_exception &ex)  

message_queue::remove("message_queue");  

return 0;  

}  

boost庫中的原子操作

boost庫這中有有關多執行緒的內容,粗略看書,似乎比c 11 的多執行緒好一丟丟。做個讀書筆記,以後忘了可以參考。原子操作 atomic 需要包含標頭檔案 include要用這個標頭檔案,boost庫是需要編譯的,最好是root許可權下編譯,要不會出錯。boost atomica 10 定義a為原...

原創 boost中thread庫的編譯

boost中的thread需要編譯成dll才能使用。首先,獲取boost 可以在cmd中敲入 cvs d pserver anonymous boost.cvs.sourceforge.net cvsroot boost login cvs z3 d pserver anonymous boost....

Boost庫的安裝

windows下的安裝和linux下安裝實際上大同小異,主要是弄清楚一些配置選項,和可執行檔案的作用。目錄為 d boost 1 62 0 step2 開啟命令提示符,找到指定目錄下的bootstrap.bat檔案,並執行 step3 執行生成的bjam.exe檔案 編譯的時間很長,耐心等待這段時間...