使用POSIX消息队列进行进程内通信

时间:2020-02-27 17:36:38

标签: linux multithreading posix embedded-linux message-queue

我正在设计一个单进程多线程嵌入式Linux应用程序。该设计包括客户机/服务器子系统,其中工作线程接收其他线程在POSIX消息队列上发布的消息。

我需要队列表现出非阻塞发送和阻塞接收语义。我可以想到几种方法来实现上述目标: -为发送和创建两个单独的消息队列描述以访问队列 接收,即两次调用mq_open。这之后将设置O_NONBLOCK标志 将用于通过队列发送的说明。

  • 指定阻止行为并使用mq_timedsend代替mq_send

  • 指定阻止行为并在mq_send之前调用mq_getattr以避免在发送时阻止

第一个解决方案可能是首选的解决方案,但是要使其正常工作,必须确保对mq_open的每次调用都会创建一个新的消息队列描述对象(我还假设进程中的线程可以使用多个这样的对象来执行操作在同一队列上。

POSIX似乎提供了这样的保证(https://pubs.opengroup.org/onlinepubs/009695399/functions/mq_open.html),但是Linux文档没有明确说明每次对mq_open的调用都会创建一个新的消息队列描述对象。

Linux是否有这样的保证?

谢谢

1 个答案:

答案 0 :(得分:3)

我需要队列表现出非阻塞发送和阻塞接收的语义。

您可以在超时过期的阻塞队列上使用mq_timedsend(例如abs_timeout{0, 0}),这会使队列满时呼叫立即返回(而不阻塞)。


我正在设计一个单进程多线程嵌入式Linux应用程序。该设计包括客户机/服务器子系统,其中工作线程接收其他线程在POSIX消息队列上发布的消息。

消息队列将数据复制到内核中并返回。无需在同一进程中的线程之间进行通信。您可以只使用带有互斥量和条件变量的队列,这与内核使用消息队列时为您执行的操作类似,但是使用您自己的队列可以避免将数据复制到内核中并返回。

我需要队列表现出非阻塞发送和阻塞接收语义。

不阻塞mq_send仅表示队列已满时不会阻塞。

The kernel protects the message queue with a spinlock internally,并且该自旋锁被锁定在mq_sendmq_receive上,因此从并发数据结构的角度来看,POSIX消息队列是一种阻塞数据结构。