2

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

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,我猜对了吗?有人可以给出它不起作用的技术幕后原因,或者至少在什么情况下它不起作用?

4

1 回答 1

3

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

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

如果你看这个boost::mutex类,它有这个typedef

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

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

于 2012-06-15T13:50:34.103 回答