我在进程 1 中有一个线程创建了一个 boost::interprocess::driven_shared_memory 段。在本段中,我使用自定义分配器分配一个 boost::interprocess::deque ,并使用默认分配器创建一个 boost::interprocess::interprocess_mutex 和 2 个 boost::interprocess::interprocess_condition 变量。我使用 find_or_construct 方法来创建它们。
我有另一个进程(进程 2),它使用我在进程 2 中打开的 boost::interprocess::driven_shared_memory 段上的 find 方法打开这些进程。
我知道 Managed_shared_memory 段具有内核或文件系统持久性,而 interprocess_mutex/interprocess_condition 变量具有进程级持久性。
我陷入困境的场景。
1) 进程 1 启动创建所有内容的线程。
2)进程2启动并打开所有内容,在此阶段共享内存和同步运行良好。
3)进程1重新启动线程,尝试再次创建所有内容(我相信它不应该,因为我正在使用find_or_construct)
4) 即使进程 1 中的线程已完成通知,进程 2 仍停留在对条件变量的等待调用上。
我是否遗漏了如何创建共享内存和互斥体/条件或持久性方面的某些内容?我在 Windows 上运行此代码。
最佳答案
考虑使用:
boost::interprocess::named_mutex
boost::interprocess::scoped_lock<boost::interprocess::named_mutex>
boost::interprocess::named_condition
而不是在现有共享内存块中分配互斥体和条件变量。 Boost 会为您处理很多杂乱的细节。
注意:您在进程空间中创建这些named_* 对象,而不是在共享内存中。 Boost 为您创建包含互斥体和条件变量的实际共享内存段。
我在尝试将共享内存段两次映射到同一进程时也遇到了麻烦。当您运行 Process1 线程的第二个实例时,是否有可能在旧映射仍然存在的情况下尝试创建新映射?
关于c++ - 在 Managed_shared_memory 中 boost 进程间互斥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18112796/