注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

mie

 
 
 

日志

 
 

关于Linux的消息队列(mq_****)  

2010-07-07 21:15:48|  分类: linux、FreeBSD等 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

关于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

  评论这张
 
阅读(4902)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016