我试图避免过度填充消息队列,所以这里有几个问题
使用mq_attr时
- mq_curmsgs 何时满?当它是 0 或 max_msgs
- 满了还需要冲洗吗?
- 您会推荐使用以下任何一种:select、poll或epoll?如果是这样,我该如何使用它们
我试图避免过度填充消息队列,所以这里有几个问题
使用mq_attr时
(1) mq_curmsgs == mq_maxmsg 已满
(2) 仅当您想继续写入时。如果您从不阅读,那么将内容排在队列中有什么意义?如果您问是否可以动态扩展队列而不是阅读它,那么不。队列限制在创建时指定。
(3) 取决于你在做什么。您阅读队列的替代方法基本上可以归结为以下几点:
mq_receive
默认会屏蔽。mq_open
更改为非阻塞mq_setattr
。这为您提供了基本的轮询功能,以查看当前是否有要阅读的内容。mq_notify
. 这允许您指定 (a) 信号或 (b) 每当空队列收到新消息时生成线程。mq_timedreceive
. 如果队列处于阻塞模式,这只会阻塞您指定的时间长度。select
在linux下使用等,因为mqd_t类型是一个文件描述符。这可能不适用于其他 POSIX 系统。 select
和兄弟为您提供了将队列与其他 i/o 事件多路复用的能力,并在队列中有要读取的内容时被通知。