提升notify_all上的进程间条件阻塞

boost interprocess condition blocking on notify_all

本文关键字:条件 进程 notify all 提升      更新时间:2023-10-16

我有一个托管共享内存段,它有一个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::mutexboost::mutex已经支持了。我想这是操作系统特定的限制。

要获得更多灵活性,请尝试使用named_upgradable_mutex

使用定时锁在进程崩溃时捕获异常,并删除可升级互斥体!。这种类型还允许任一线程获得提升的特权!