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

Using POSIX message queues for intra-process communication

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

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

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

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

Linux有这样的保证吗?

谢谢,

I need the queue to exhibit non-blocking send and blocking receive semantics.

您可以在超时超时的阻塞队列上使用 mq_timedsend(例如 abs_timeout{0, 0}),这会在队列满时立即调用 return(不阻塞)。


I am designing a single-process multi-threaded embedded Linux application. The design includes client-server subsystem where a worker thread receives messages posted by other threads on a POSIX message queue.

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

I need the queue to exhibit non-blocking send and blocking receive semantics.

非阻塞mq_send只表示队列满了不阻塞

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