与boost :: interprocess_mutex相比,为什么不在共享内存中使用boost :: mutex?

时间:2012-06-15 13:43:44

标签: c++ shared-memory boost-interprocess boost-mutex

现在有一段时间在愤怒中学习和使用提升共享内存我已经到了一个心智模型,什么时候使用什么类型的互斥,看起来像这样:

class IntendedToResideInProcessMemory {
    boost::mutex mutex_for_this_process; // 1
    boost::interprocess::interprocess_mutex
        ok_but_pointless_to_use_interprocess_mutex_here; // 2
}

class IntendedToBeCreatedInSharedMemory {
    boost::mutex bad_mutex_at_a_guess_this_will_allocate_something_on_heap;// 3
    boost::interprocess::interprocess_mutex
        good_for_multiprocess_shared_lock; // 4
}

我希望我原则上没有错,所以如果是这样请纠正我。我的目的是继续前进并纠正现有的代码以及我自己的代码,但这些代码不符合这张图片,但我想确定。

这个问题的两个部分: 我认为它确实没问题,但使用// 2毫无意义 - 在上下文中这不如// 1好,但原因是什么?性能

对于// 3,我猜对了吗?有人可以提供技术幕后的原因,说明为什么它不起作用,或者至少在什么情况下不起作用?

1 个答案:

答案 0 :(得分:3)

关于第3点:您的其他流程无法看到您的boost::mutex。进程间互斥体使用一个全局命名的对象系统,该对象可以由另一个进程访问,afaik,boost::mutex没有。

您在共享内存中创建的boost::mutex可能在Windows中有一个HANDLE到Windows Mutex对象,该对象将在您的进程的私有堆上分配。其他进程看不到此堆。

如果您查看boost::mutex课程,则会显示此typedef

typedef platform-specific-type native_handle_type;这是特定于平台的。

另一个例子:POSIX互斥体由它们的地址标识,它们在进程之间是不同的 感谢@DeadMG的例子:)