關於Linux的訊息佇列

來源:互聯網
上載者:User

http://news.ddaaoo.com/Topic/view/id-57255 

關於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)
{
struct timespec t;
t.tv_sec=0;
t.tv_nsec=TIME_NON_100;

return mq_timedsend(mqdes msg_ptr msg_len msg_prio &t);
}

這裡,我設定了逾時時限為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)
{
struct timespec t;
t.tv_sec=0;
t.tv_nsec=1;

return mq_timedsend(mqdes msg_ptr msg_len msg_prio &t);
}

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

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

mqd_t g_my_mq_send(mqd_t mqdes const char *msg_ptr
size_t msg_len unsigned msg_prio)
{
struct timespec t;
t.tv_sec=0;
t.tv_nsec=0;

return mq_timedsend(mqdes msg_ptr msg_len msg_prio &t);
}

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

似乎還是不太好,再改:

inline mqd_t g_my_mq_send(mqd_t mqdes const char *msg_ptr
size_t msg_len unsigned msg_prio)
{
struct timespec t;
t.tv_sec=0;
t.tv_nsec=0;

return mq_timedsend(mqdes msg_ptr msg_len msg_prio &t);
}

那就內聯,OK!

By: zhanyonhu

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.