我希望在单个进程多线程应用程序上使用POSIX消息队列。 mqueues将用于在线程之间共享数据。
我对他们在Linux内核中的工作方式感到有些困惑。是否所有消息都通过内核空间然后返回到接收上的用户空间?来自用户空间线程的a.k.a.我做一个mq_send,消息最终在内核空间中,然后在接收时,它是从内核空间获取消息的另一个系统调用。如果是这样,对于高使用率的消息队列来说这不是非常低效吗?
答案 0 :(得分:7)
是的,它们将始终通过内核(通常用于进程间通信)。如果您只是想要线程间通信,那么您可以通过。一个简单的工作队列(使用普通的旧互斥体)。
如果你想要一些功能更多的东西,你几乎肯定会更喜欢看AMQP之类的东西。
传统上Unix / Linux使用套接字+读/写,但这取决于你想要什么(以及你想如何使用它)。
答案 1 :(得分:5)
我必须反对MQ是“高度”低效的概念。
确实,在向/从内核复制数据方面存在一些开销,对于真正的高性能应用程序而言,这可能是使用共享或堆内存的真正考虑和理由。
但缺乏编写良好的共享内存代码MQ是最快的IPC,并配备了大量的内置工具。消除了同步化的麻烦,并且(至少在linux下)消息队列描述符(mqd_t)可以用作select()语句中的文件描述符。除了等待互斥锁或不断轮询互斥之外,这还可以提供相当大的灵活性。另外,MQ是内核持久性的,如果队列数据在应用程序崩溃中存活很重要,这是一个很好的小功能。