避免在 boost::interprocess::managed_shared_memory 内锁定

Avoid locking inside of boost::interprocess::managed_shared_memory

我想创建一个 managed_shared_memory,它将由进程 A 创建和写入并由进程 B 读取。到目前为止,我设法实现了我想要的功能,但我意识到当进程在 .find.construct 操作期间崩溃,互斥量将不会被解锁(因此它不是一个健壮的互斥量)。 documentation says 有一种方法可以禁用共享内存的内部锁定。这会很棒,因为无论如何我都想使用 interprocess_condition

The synchronization type (MemoryAlgorithm::mutex_family) to be used in all allocation operations. This allows the use of user-defined mutexes or avoiding internal locking (maybe code will be externally synchronized by the user).

问题是我完全不知道如何更改 managed_shared_memory 对象的锁定行为。我查看了它的构造函数,但找不到解决此问题的方法。

我只能使用 boost 1.60,而且我正在为 Linux 设备写作,尽管任何便携式解决方案都是首选,因为无论如何我都在使用 boost。

The problem is I am at a total loss on how to change the locking behavior of the managed_shared_memory object. I looked through its constructors but I cannot find a solution to this problem.

好的,我认为选择是硬编码的 - 有充分的理由。正如我在评论中所说,如果不同步段元数据,就没有从不同进程访问托管内存段的安全方法。

现在,如果你绝对确定你想要(你正处于用足够的绳索吊死自己的领域)你可能应该 手动挂载托管外部缓冲区:

Managed External Buffer: Constructing all Boost.Interprocess objects in a user provided buffer

您当然仍然可以将其放在 可映射对象 的(非托管)mapped_region 中(如 shared_memory_object)。

您可以根据需要参数化您的托管外部缓冲区,但默认设置已经不锁定:

typedef basic_managed_external_buffer <
   char,
   rbtree_best_fit<null_mutex_family, offset_ptr<void> >,
   flat_map_index
   >  managed_external_buffer;