我有一个托管共享内存段,它有一个boost :: interprocess :: interprocess_mutex和一个boost :: interprocess :: interprocess_condition变量。我有2个进程访问共享内存,他们正在根据互斥和条件同步访问。我遇到过第一个进程阻塞notify_all方法的情况,最初我认为这是一个非阻塞方法,但似乎进程间条件实现了一个用于同步自身的互斥锁。
我得到这个死锁的情况是当进程2在等待条件时被非常地杀死时,我相信这会阻止互斥锁被解锁的条件,然后当我再次运行进程2时它会阻塞。在我第二次开始处理2时,是否有重置或清理进程间条件。
答案 0 :(得分:0)
http://www.boost.org/doc/libs/1_48_0/boost/interprocess/sync/interprocess_mutex.hpp
您使用定时锁定吗?
对于简单的死锁避免算法,请查看此处:Wikipedia
它适用于线程,但我相信它可以与interprocess_locks一起使用。
递归地,只允许一个线程通过锁。 如果其他线程进入锁定,则必须等到初始线程 通过的次数完成了n次。但如果数量 进入锁定的线程等于被锁定的数字,分配 一个线程作为超线程,只允许它运行(跟踪 它进入/退出锁定的次数,直到它完成。 超线程完成后,条件将更改回使用递归锁定的逻辑和退出的超线程
将自己设置为不是超级线程
通知锁柜员其他锁定的等待线程需要重新检查此情况
如果存在死锁场景,请设置新的超线程并遵循该逻辑。否则,请恢复常规锁定。
请注意,上述算法无法解决 livelock 情况,以防止此类行为在可能的情况下使用semaphore
。
我惊讶地注意到interprocess_mutex不支持实现死锁避免算法,因为现在大多数互斥锁已经完成了std::mutex
和boost::mutex
。
我想这是操作系统特有的限制。
为了获得更大的灵活性,请尝试使用named_upgradable_mutex
当进程崩溃并删除 可升级的互斥锁时,使用定时锁捕获异常。此类型还允许通过任一线程获取提升的权限!