C++ boost::进程间准备好进入黄金时段了吗?

C++ boost::进程间准备好进入黄金时段了吗?,c++,boost-interprocess,C++,Boost Interprocess,我正在处理一个由内存映射文件支持的线程安全队列,该队列大量使用boost进程间处理。我把它提交给代码审查,一位比我在这个星球上拥有更多经验的开发人员说,他觉得boost::interprocess“已经准备就绪”,我不应该直接使用pthreads 我想那主要是FUD。我个人认为重新实现诸如可升级的互斥或boost::interprocess::deque之类的东西是非常荒谬的,但我很想知道其他人是怎么想的。我找不到任何数据支持他的说法,但也许我只是无知或天真。请你开导我 我试图在一个项目中使用b

我正在处理一个由内存映射文件支持的线程安全队列,该队列大量使用boost进程间处理。我把它提交给代码审查,一位比我在这个星球上拥有更多经验的开发人员说,他觉得boost::interprocess“已经准备就绪”,我不应该直接使用pthreads


我想那主要是FUD。我个人认为重新实现诸如可升级的互斥或boost::interprocess::deque之类的东西是非常荒谬的,但我很想知道其他人是怎么想的。我找不到任何数据支持他的说法,但也许我只是无知或天真。请你开导我

我试图在一个项目中使用boost::interprocess,但结果却喜忧参半。我最担心的是boost::offset_ptr的设计以及它如何处理空值——简言之,boost::interprocess会让诊断空指针错误变得非常痛苦。问题是共享内存段被映射到进程的地址空间中间,这意味着“null”OffStjtpTR在被删除时将指向一个有效的内存位置,因此您的应用程序不会分段。这意味着当你的应用程序最终崩溃时,可能是在错误发生很久之后,这使得调试变得非常棘手

但情况变得更糟了。boost:::进程间内部使用的互斥量和条件存储在段的开头。因此,如果您不小心写入了某个\u null\u offset\u ptr->some\u成员,您将开始覆盖boost::进程间段的内部机制,并获得完全奇怪和难以理解的行为。编写协调多个进程和处理可能的竞争条件的代码本身可能很难,所以它是双重的疯狂

最后,我编写了自己的最小共享内存库,并使用POSIX mprotect系统调用使共享内存段的第一页不可读和不可写,这使得空错误立即出现(你浪费了一页内存,但这样一个小小的牺牲是值得的,除非你是在嵌入式系统上)。您可以尝试使用boost::interprocess,但仍然手动调用mprotect,但这不起作用,因为boost希望它能够写入存储在段开头的内部信息

最后,offset_ptr假设您正在共享内存段中存储指向同一共享内存段中其他点的指针。如果您知道将有多个共享内存段(我知道会是这种情况,因为我有一个可写段和一个只读段),它们将指针存储到另一个段中,偏移量会妨碍您,您必须进行大量手动转换。在我的共享内存库中,我创建了一个模板化的
SegmentPtr
类,其中
SegmentPtr
将是指向一个段的指针,
SegmentPtr
将是指向另一个段的指针,等等。这样它们就不会混淆(但只有在编译时知道段数的情况下才能这样做)

您需要权衡自己实现一切的成本与跟踪空错误和可能混淆指向不同段的指针(后者对您来说不一定是问题)所花费的额外调试时间。对我来说,自己实现这些东西是值得的,但我并没有大量使用boost::interprocess提供的数据结构,所以这显然是值得的。如果该库在将来被允许开源(不是由我决定),我会用一个链接更新,但现在不要屏住呼吸;p


不过,关于您的同事:我没有在boost::interprocess本身中遇到任何不稳定或错误。我只是觉得它的设计让你更难在自己的代码中发现bug。

我们已经使用boost::进程间共享内存,并且已经使用了大约6个月,我们发现代码是可靠的、稳定的,而且相当容易使用

我们将数据保存在相当简单的固定大小的结构中(尽管12个区域的大小总计为2+gb),我们使用了boost::进程间示例代码,几乎没有问题

在windows中使用boost::interprocess时,我们确实发现了两个需要注意的事项

  • 复习。如果使用默认的
    #include
    对象,则只能通过先重新启动Windows来增加内存映射区域的大小。这是因为boost如何使用文件备份存储
  • 消息队列类使用默认的共享内存对象。因此,如果需要增加邮件大小,请重新启动Windows

  • 我并不是说Joseph Garvin关于boost::interprocess问题的帖子是无效的。我认为我们经验的不同与使用图书馆的不同方面有关。我同意他的说法,boost::interprocess中似乎没有任何稳定性问题。

    不是重新启动Windows,而是重新启动应用程序?我看不到任何关于在你的链接上重新启动Windows的信息,也不明白使用文件作为备份存储如何使这成为必要