【问题标题】:Order in which mq_receive calls on an empty POSIX message queue unblockmq_receive 调用空 POSIX 消息队列解除阻塞的顺序
【发布时间】:2020-03-27 06:57:19
【问题描述】:

当创建消息队列没有 O_NONBLOCK 时,如果队列为空mq_receive() 会调用 block。当一条新消息被发送到队列时,等待的mq_receive() 调用中的哪个实际上解除了阻塞?

QNX 文档明确提到了 FIFO 顺序:

如果多个 mq_receive() 呼叫在单个队列中被阻止,则 当消息到达时,它们按 FIFO 顺序解锁。 https://www.qnx.com/developers/docs/6.3.0SP3/neutrino/lib_ref/m/mq_receive.html

所有 POSIX IPC 实现都是这种情况吗? Linux 实现是做什么的?手册页相当不具体:

如果队列为空,则默认情况下,mq_receive() 会阻塞,直到 消息可用,或呼叫被信号中断 处理程序。

【问题讨论】:

    标签: linux posix ipc message-queue


    【解决方案1】:

    POSIX documentation for mq_receive()

    如果消息到达空队列时有多个线程在等待接收消息,并且支持优先级调度选项,则应选择等待时间最长的最高优先级线程来接收消息。否则,不指定哪个等待线程接收消息。

    Linux 手册页没有提到任何关于优先级调度规则的内容,但我不知道这是遗漏还是因为它没有实现该功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-09
      • 2013-03-21
      • 2016-06-03
      • 2020-11-27
      • 2019-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多