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

Select Boost消息队列不基于POSIX消息队列?无法选择(2)?,select,boost,message-queue,interprocess,epoll,Select,Boost,Message Queue,Interprocess,Epoll,我想我应该用Boost.Interprocess代替套接字在一台主机内进行通信。但是在深入研究之后,这个库似乎出于某种原因避开了POSIX消息队列工具(我的Linux系统支持它),而是在POSIX共享内存之上实现的。界面非常相似,您可能不会马上猜到,但似乎是这样 我的缺点是,通过shm_open(3)获得的共享内存似乎不可用于select(2),而不是通过mq_open(3)获得的POSIX消息队列 在这种情况下,Boost的库似乎失败了。有人知道为什么会这样吗?即使it POSIX消息队列仅在

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

我的缺点是,通过
shm_open(3)
获得的共享内存似乎不可用于
select(2)
,而不是通过
mq_open(3)
获得的POSIX消息队列


在这种情况下,Boost的库似乎失败了。有人知道为什么会这样吗?即使it POSIX消息队列仅在某些系统上可用,我也希望Boost在可用的地方使用该功能,并仅在必要时重新实现它。POSIX系统是否存在一些我还不认识的缺陷?

前几天我在使用Boost.Interprocess的同步类时遇到了类似的情况:即condition类。它是以一种“通用”的方式实现的,但它的实现方式是使用一个非常低效的自定义自旋锁(至少在OSX上)。无论出于何种目的,它都使得sync类毫无用处

根据我的经验,进程间库是相当不成熟的。我使用它来共享内存,它确实工作得很好,但是有一些粗糙的边缘,我不得不破解一些“缺失的功能”,比如动态调整共享内存的大小等等


总之,现在还不要指望这个库是一个银弹。这很好,但在这个时候并不例外。

是的,不幸的是不是。我也很失望,当我发现在挖掘资源之后

但这一事实还有另一个(好的)方面:如果您的程序使用
boost::asio
,您可以将POSIX消息队列API包装为另一个数据报数据源,如果它是
boost::interprocess
的一部分,那么使用它(IMHO)会更好。。。这将是非常重要的,但(IMHO)绝对值得这样做,所以您可以以统一的方式使用w/MQ,并使用其他
boost::asio
东西的功能


。。。在我的下一个项目中,如果我再次需要POSIX MQ,我肯定会这样做:)

注意,在Linux上,它使用pshared互斥体和条件变量,而不是使用自定义自旋锁,这应该与同一进程中的互斥体一样有效。但是,要在
boost::interprocess
对象上选择,您需要有一个线程来监视有问题的对象,并在有一些数据等待时触发fifo或eventfd。不过,没有解释为什么boost::interprocess在可用时不使用posix MQUE。。。我自己做了一个MQUE摘要,在win32上构建时,我的抽象使用boost::interprocess::MQUE,在linux上构建时,我的抽象使用posix MQUE。这很简单,这就是为什么我找不到boost::interprocess不这样做的原因。不成熟?我监督过一些事情吗?我有同样的想法,使用boost::asio作为消息队列,正如您所建议的,只是作为另一个数据报源。您是否有向boost::asio添加数据报源的经验?通过阅读boost的一些源代码,我几乎没有触及这个主题的表面,但我还没有找到关于这个主题的好文档/教程。。。