2

我在进程 1 中有一个线程创建一个 boost::interprocess::managed_shared_memory 段。在这一部分中,我使用自定义分配器分配了一个 boost::interprocess::deque,并使用默认分配器创建了一个 boost::interprocess::interprocess_mutex 和 2 个 boost::interprocess::interprocess_condition 变量。我使用 find_or_construct 方法来创建这些。

我有另一个进程(进程 2),它使用我在进程 2 中打开的 boost::interprocess::managed_shared_memory 段上的 find 方法打开这些。

我了解 managed_shared_memory 段具有内核或文件系统持久性,而 interprocess_mutex/interprocess_condition 变量具有进程级持久性。

我被卡住的场景。

1) 进程 1 启动创建所有内容的线程。

2)进程2启动并打开所有东西,在这个阶段共享内存和同步运行良好。

3)进程1重新启动试图再次创建所有内容的线程(我相信它不应该,因为我正在使用find_or_construct)

4) 尽管进程 1 中的线程已经执行了通知,进程 2 仍停留在对条件变量的等待调用中。

在如何创建共享内存和互斥体/条件或持久性方面,我是否遗漏了一些东西?我在 Windows 上运行此代码。

4

1 回答 1

3

考虑使用:

boost::interprocess::named_mutex
boost::interprocess::scoped_lock<boost::interprocess::named_mutex>
boost::interprocess::named_condition 

而不是在现有的共享内存块中分配互斥锁和条件变量。Boost 为您处理了很多杂乱的细节。

注意:您在进程空间中创建这些 named_* 对象,而不是在共享内存中。Boost 会为您创建包含互斥体和条件变量的实际共享内存段。

尝试将共享内存段两次映射到同一个进程中时,我也遇到了麻烦。当您运行试图创建新映射而旧映射仍然存在的 Process1 线程的第二个实例时,是否有机会?

于 2013-08-07T20:38:40.020 回答