提升notify_all上的进程间条件阻塞
boost interprocess condition blocking on notify_all
我有一个托管共享内存段,它有一个boost::interprocess::interprocess_mutex和一个boost::interrocess::interprocedure_condition变量。我有两个进程访问共享内存,它们基于互斥和条件同步访问。我遇到过一个案例,我的第一个进程在notify_all方法上阻塞,起初我认为这是一个非阻塞方法,但进程间条件似乎实现了一个用于同步自身的互斥。
我遇到这种死锁的情况是,进程2在等待条件时被意外地杀死,我相信这会阻止条件互斥被解锁,然后当我再次运行进程2时,它会阻塞。在我第二次启动进程2时,是否存在重置或清理进程间条件的问题。
http://www.boost.org/doc/libs/1_48_0/boost/interprocess/sync/interprocess_mutex.hpp
您是否使用定时锁?
关于一个简单的死锁避免算法,请查看此处:维基百科
它是针对线程的,但我相信它可以与interprocess_locks一起使用。
递归地,只允许一个线程通过一个锁。如果其他线程进入锁,它们必须等到初始线程通过的完成n次。但是如果进入锁定状态的线程数等于被锁定的线程数,赋值一个线程作为超级线程,并且只允许它运行(跟踪它进入/退出锁定的次数),直到它完成为止。超级线程完成后,条件变回使用递归锁的逻辑,并且退出的超级线程
将自己设置为不是超级线程
通知locker其他被锁定、等待的线程需要重新检查此条件
如果存在死锁场景,请设置一个新的超级线程并遵循该逻辑。否则,请恢复常规锁定。
请注意,上面的算法不能解决livelock的情况,为了防止这种行为,如果可能的话,请使用semaphore
。
我惊讶地注意到interprocess_mutex不支持实现死锁避免算法,因为现在大多数互斥体,即std::mutex
和boost::mutex
已经支持了。我想这是操作系统特定的限制。
要获得更多灵活性,请尝试使用named_upgradable_mutex
使用定时锁在进程崩溃时捕获异常,并删除可升级互斥体!。这种类型还允许任一线程获得提升的特权!
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- boost::进程间消息队列引发错误
- 在没有太多条件句的情况下,我如何避免被零除
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 基于多个条件处理地图中的所有元素
- 条件constexpr函数
- IPC使用多个管道和分支进程来运行Python程序
- 无论条件是否为true,if总是在c++中执行
- 从stdin读取时子进程挂起(fork/dup2竞争条件)
- 使用互斥锁和条件变量增强跨内存的进程间共享向量
- 使用文件锁定的进程之间的条件变量
- 启动子进程时的争用条件导致从管道读取挂起
- boost::OSX 上 32 位和 64 位程序之间共享内存中的进程间同步机制(互斥体、条件)
- boost::进程间消息队列创建时的竞争条件
- 在POSIX中,我可以保存信号以供调用条件等待的其他线程使用吗.(这些线程来自同一进程)
- 增强进程间争用条件预防
- 提升notify_all上的进程间条件阻塞
- Boost进程间共享互斥锁和Boost进程间共享互斥锁的条件变量
- C++:监视和条件变量进程间