關於Linux的訊息佇列

2022-08-04 10:51:08 字數 1343 閱讀 1828

關於linux的訊息佇列:

mq_open用於日誌記錄中,當有新日誌新增到佇列中,我就mq_send乙個訊息,日誌記錄執行緒就開始記錄資料,直至日誌隊列為空,然後繼續等待。

但是,遇到了第乙個情況:近乎死鎖的長時間等待!因為如果設定為阻塞的,mq_send將在傳送勝利後之後返回!這很容易導致死鎖!試想,如果大量的訊息往佇列裡面填充,導致佇列始終是滿的,就會有很多mq_send不得不等待!所以,建議使用時,mq_open的引數加上o_nonblock! 但是,這樣也會出現ealign錯誤,也就是非阻塞錯誤。

接著是第二個情況。mq_receive失敗!如果接收緩衝區的大小和mq_open時設定的大小不一致,就會出現這種情況。

所以,我首先設定為阻塞。另外,對我來說,我只要知道存在乙個訊息就可以了,所以,我不需要準確接收到每個訊息,只要訊息佇列中存在訊息就可以了,因為那樣我必然會得到系統的通知。

所以,我的設定如下:

1. 建立訊息佇列

2. 自定義傳送訊息:

#define time_non_100 100

mqd_t g_my_mq_send(mqd_t mqdes const char *msg_ptr

size_t msg_len unsigned msg_prio);

mqd_t g_my_mq_send(mqd_t mqdes const char *msg_ptr

size_t msg_len unsigned msg_prio)

這裡,我設定了超時時限為100納秒。超過100納秒還沒能傳送勝利,就直接返回了!

3.整常接收

4. 關閉訊息佇列

經過測試,效能增加n倍!

但是,我覺得這樣還不夠!100納秒也是時間,對於人來說,100納秒微不足道,但是,對於計算機就不同了。所以,**改為:

mqd_t g_my_mq_send(mqd_t mqdes const char *msg_ptr

size_t msg_len unsigned msg_prio)

一納秒!速度又快了一點!

還是不行!存在cpu切換和系統時鐘中斷,這會影響效能!所以,如下:

mqd_t g_my_mq_send(mqd_t mqdes const char *msg_ptr

size_t msg_len unsigned msg_prio)

這下提高得不明顯,基本上感覺不到了。理論上應該更快了。

似乎還是不太好,再改:

inline mqd_t g_my_mq_send(mqd_t mqdes const char *msg_ptr

size_t msg_len unsigned msg_prio)

那就內聯,ok!

by: zhanyonhu

linux訊息佇列 Linux訊息佇列

訊息佇列,unix的通訊機制之一,可以理解為是乙個存放訊息 資料 容器。將訊息寫入訊息佇列,然後再從訊息佇列中取訊息,一般來說是先進先出的順序。可以解決兩個程序的讀寫速度不同 處理資料速度不同 系統耦合等問題,而且訊息佇列裡的訊息哪怕程序崩潰了也不會消失。最簡單的訊息記憶體的使用流程 ftok函式生...

關於訊息佇列的理解

目前常用的訊息中介軟體有activemq,rabbitmq,kafka等 之前的專案一直使用activemq,但是面試的時候人家問我訊息佇列我都說只用了通訊,不敢亂說.所以專門了解了下.這是在知乎上面看的感覺很不錯很感謝作者 假設使用者在你的軟體中註冊,服務端收到使用者的註冊請求後,它會做這些操作 ...

linux訊息佇列

訊息佇列是核心位址空間中的內部鍊錶,每個訊息佇列都在系統範圍內對應唯一的鍵值,所以,要獲得乙個訊息佇列的描述字,只需提供該訊息佇列的鍵值即可。1 訊息緩衝區結構 存放訊息資料的模板,可在基本定義的基礎上自己定義 在include linux msg.h中宣告,描述如下 struct 可以定義自己的例...