C++ 增强托管共享内存中的进程间互斥

C++ 增强托管共享内存中的进程间互斥,c++,multithreading,boost,ipc,sync,C++,Multithreading,Boost,Ipc,Sync,进程1中有一个线程创建boost::进程间::托管共享内存段。在此段中,我使用自定义分配器分配boost::interprocess::deque,并使用默认分配器创建boost::interprocess::interprocess_互斥体和2个boost::interprocess::interprocess_条件变量。我使用find_或_construct方法来创建这些 我有另一个进程(进程2),它使用我在进程2中打开的boost::interprocess::managed_shared

进程1中有一个线程创建boost::进程间::托管共享内存段。在此段中,我使用自定义分配器分配boost::interprocess::deque,并使用默认分配器创建boost::interprocess::interprocess_互斥体和2个boost::interprocess::interprocess_条件变量。我使用find_或_construct方法来创建这些

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

我知道托管共享内存段具有内核或文件系统持久性,进程间互斥/进程间条件变量具有进程级持久性

我陷入困境的情景

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

2) 进程2启动并打开所有内容,在这个阶段,共享内存和同步工作正常

3) 进程1重新启动试图再次创建所有内容的线程(我认为它不应该,因为我正在使用find_或_构造)

4) 进程2在条件变量的等待调用中被卡住,即使进程1中的线程执行了通知

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

请考虑使用:

boost::interprocess::named_mutex
boost::interprocess::scoped_lock<boost::interprocess::named_mutex>
boost::interprocess::named_condition 
boost::进程间::命名互斥
boost::进程间::作用域锁定
boost::进程间::命名的\u条件
而不是在现有共享内存块中分配互斥量和条件变量。Boost为您处理了很多混乱的细节

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


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

我不确定它是否试图创建新映射,我不这么认为,因为我认为它会尝试打开现有映射。有办法检查吗?最初我尝试使用当时命名的_互斥和命名的_条件变量,但遇到了条件变量的问题,我将其发布在stackoverflow上,但没有得到答案。我看了你的另一个问题,一旦我理解了它(很抱歉评论太多,但我是在后台编译的,所以我在第一次阅读时错过了一些东西。)我同意那里的代码是正确的(除非创建/销毁互斥和共享内存段,但不创建/销毁条件变量)嗨,Dale,我不知道静态包装器是做什么的。不过我的理解是,在线程的开始或结束时调用的remove方法应该只在没有任何东西连接到它的情况下删除内容,对吗?我使用了一个命名的_互斥体来保护共享_内存区域的构造。(没有管理,我自己分配了内存)在该区域中,我分配了一个包含boost::interprocess::interprocess_互斥体和boost::interprocess::interprocess_条件的对象。使用boost::interprocess::scoped_Lock来锁定/解锁它。这起到了作用。一个区别……作为一般规则,我总是在通知条件之前尝试解锁互斥体。这避免了sleeping进程将唤醒并尝试重新获取互斥体,但失败,因为通知进程仍然具有互斥体(即,它通常会减少一次通过调度程序的行程)