在managed_shared_memory中增强进程间互斥

时间:2013-08-07 20:05:42

标签: c++ multithreading boost ipc sync

我在进程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上运行此代码。

1 个答案:

答案 0 :(得分:2)

考虑使用:

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

而不是分配互斥锁&amp;现有共享内存块中的条件变量。 Boost为你处理了很多混乱的细节。

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

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