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

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

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

有帮助吗?

解决方案

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

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

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

其他提示

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top