Boost Message Queue不是基于POSIX消息队列?无法选择(2)?

时间:2009-01-02 21:21:12

标签: select boost message-queue interprocess epoll

我以为我会使用Boost.Interprocess的Message Queue代替套接字在一个主机内进行通信。但是在深入研究之后,似乎这个库出于某种原因避开了POSIX消息队列工具(我的Linux系统支持),而是在POSIX共享内存之上实现。界面足够相似,你可能不会马上猜到这一点,但似乎是这样。

我的缺点是通过shm_open(3)获得的共享内存似乎不能与select(2)一起使用,而不是通过mq_open(3)获得的POSIX消息队列。

在这种情况下,Boost的图书馆似乎失败了。有谁知道为什么这应该是?即使POSIX消息队列仅在某些系统上可用,我也希望Boost在可用的情况下使用该设施,并且只在必要时重新实现它。 POSIX系统是否存在一些我尚未认识到的陷阱?

2 个答案:

答案 0 :(得分:4)

我在使用Boost.Interprocess'同步类时遇到了类似的情况:即条件类。它以“通用”方式实现,但它的完成方式是使用高度低效的自定义螺旋锁(至少在OS X上)。对于所有意图和目的,它使同步类无用。

根据我的经验,Interprocess库非常不成熟。我将它用于共享内存,它确实运行良好,但有一些粗糙的边缘,我不得不破解一些“缺少功能”,如动态调整共享内存等。

总之,不要指望这个库只是一个银弹。这很好,但此时并不特别。

答案 1 :(得分:2)

是的,不幸的是没有。在挖掘资源后,我也很失望。

但这是其他(好)方面的事实:如果您的程序使用boost::asio,您可以将POSIX消息队列API包装为只是另一个数据报数据源而且这个(恕我直言)如果它是boost::interprocess的一部分会更好使用......这将是非常重要的,但是(恕我直言)肯定值得这样做,所以你可以使用MQ工作统一的方式并使用其他boost::asio内容的 power ......

...在我的下一个项目中,如果我再次需要POSIX MQ,我肯定会采取这种方式:)