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

问题描述 投票:3回答:1

我正在设计一个单进程多线程嵌入式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是否有这样的保证?

谢谢,

linux multithreading posix embedded-linux message-queue
1个回答
3
投票

我需要队列展示非阻塞发送和阻塞接收语义。

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


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

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

我需要队列显示非阻塞发送和阻塞接收语义。

非阻塞abs_timeout{0, 0}仅表示队列已满时不会阻塞。

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

© www.soinside.com 2019 - 2024. All rights reserved.