关于Linux的消息队列

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

你可能感兴趣的:(linux)