【发布时间】:2020-06-11 19:12:37
【问题描述】:
我正在设计一个单进程多线程嵌入式 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有这样的保证吗?
谢谢,
【问题讨论】:
-
这听起来像数据报 unix 域套接字会更合适。由于这都是一个进程,您可以使用
socketpair()创建一对匿名的双向套接字来使用。或者只是一个无锁队列数据结构。 -
你考虑过 ZeroMQ 吗?使用
inproc传输意味着它可以避免将数据复制进/出内核,因此它可能比 Posix 消息队列更快。它还具有人们可能需要的所有语义/传输/模式。
标签: linux multithreading posix embedded-linux message-queue