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