c++ - 在 Managed_shared_memory 中 boost 进程间互斥

标签 c++ multithreading boost ipc synchronization

我在进程 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/

相关文章:

c++ - 模板类型推导失败

c++ - 为 STL 排序算法定义 < - 运算符重载、仿函数或独立函数?

c++ - Windows C++ : Get driver device ID

java - 当- A. 从 Runnable 调用 Activity 方法时会发生什么 B. 多个线程同时调用 Activity 方法

multithreading - "mutex"和 "atomic operation"之间有什么区别吗?

java - 同名嵌套锁

c++ - 轻量级 boost::bind

c++ - MSVC 在没有编译任何源代码的情况下因编译器错误而失败

c++ - 如何使用 scons 和 Visual C++ 链接到使用静态库本身的静态库?

c++ - boost 测试预期 throw