0

我试图避免过度填充消息队列,所以这里有几个问题

使用mq_attr时

  1. mq_curmsgs 何时满?当它是 0 或 max_msgs
  2. 满了还需要冲洗吗?
  3. 您会推荐使用以下任何一种:selectpollepoll?如果是这样,我该如何使用它们
4

1 回答 1

1

(1) mq_curmsgs == mq_maxmsg 已满

(2) 仅当您想继续写入时。如果您从不阅读,那么将内容排在队列中有什么意义?如果您问是否可以动态扩展队列而不是阅读它,那么不。队列限制在创建时指定。

(3) 取决于你在做什么。您阅读队列的替代方法基本上可以归结为以下几点:

  1. mq_receive默认会屏蔽。
  2. 可以使用 将队列打开为非阻塞,也可以使用mq_open更改为非阻塞mq_setattr。这为您提供了基本的轮询功能,以查看当前是否有要阅读的内容。
  3. 您可以使用mq_notify. 这允许您指定 (a) 信号或 (b) 每当空队列收到新消息时生成线程。
  4. 您可以使用mq_timedreceive. 如果队列处于阻塞模式,这只会阻塞您指定的时间长度。
  5. 你可以select在linux下使用等,因为mqd_t类型是一个文件描述符。这可能不适用于其他 POSIX 系统。 select和兄弟为您提供了将队列与其他 i/o 事件多路复用的能力,并在队列中有要读取的内容时被通知。
于 2013-06-26T02:12:02.957 回答