我试图对一个项目使用boost :: interprocess,并带着各种各样的感觉走开。我主要的担心是boost :: offset_ptr的设计,以及它如何处理NULL值 - 简而言之,boost :: interprocess可以诊断NULL指针错误真的很痛苦。问题是共享内存段被映射到进程地址空间中间的某个地方,这意味着“NULL”offset_ptr在取消引用时将指向有效的内存位置,因此您的应用程序将不会 segfault 。这意味着,当你的应用程序最终崩溃时,可能在错误发生后很长时间,使调试变得非常棘手。
但它变得更糟。 boost ::: interprocess内部使用的互斥和条件存储在段的开头。因此,如果您不小心写入some_null_offset_ptr-> some_member,您将开始覆盖boost :: interprocess段的内部机制,并且会变得非常奇怪且难以理解的行为。编写协调多个进程并处理可能的竞争条件的代码本身可能很艰难,所以它非常令人生气。
我最终编写了我自己的最小共享内存库,并使用POSIX mprotect系统调用使我的共享内存段的第一页不可读且不可写,这使得立即出现NULL错误(您浪费了一页内存,但是这样做除非你在嵌入式系统上,否则一个小牺牲是值得的)。您可以尝试使用boost :: interprocess,但仍然手动调用mprotect,但这样做不起作用,因为boost会期望它可以写入在段开始时存储的内部信息。
最后,offset_ptr的假设你正在将共享内存段中的指针存储到同一共享内存段中的其他点。如果你知道你将拥有多个共享内存段(我知道这是因为对我来说,因为我有一个可写段和一个只读段),它们将指针彼此存储,offset_ptr的方式和你必须做一堆手动转换。在我的共享内存库中,我制作了一个模板SegmentPtr<i>
类,其中SegmentPtr<0>
将指向一个段的指针,SegmentPtr<1>
将指向另一个段的指针等,以便它们不会混淆(只有知道该数字时才可以这样做在编译时段)。
您需要权衡自己实现所有事情的成本,而不是额外的调试时间,您将花费追踪NULL错误并潜在地混合指向不同段的指针(后者对您而言不一定是问题)。对我来说,实现自己的东西是值得的,但我并没有大量使用boost :: interprocess提供的数据结构,所以显然值得。如果图书馆未来可以成为开源软件(不适合我),我会用链接更新,但现在不要屏住呼吸; p
对于你的同事,虽然:不会遇到boost :: interprocess本身的任何不稳定或错误。我只是觉得它的设计让你很难在自己的代码中发现错误。
而不是重新启动的Windows您是不是要重新启动应用程序?我没有看到有关在链接上重新引导Windows的任何信息,或者了解如何使用文件作为支持存储可以创建必要的O_o – 2010-07-08 18:00:11