在notify_all上增强进程间条件阻塞

时间:2013-08-14 19:10:56

标签: c++ boost ipc mutex shared-memory

我有一个托管共享内存段,它有一个boost :: interprocess :: interprocess_mutex和一个boost :: interprocess :: interprocess_condition变量。我有2个进程访问共享内存,他们正在根据互斥和条件同步访问。我遇到过第一个进程阻塞notify_all方法的情况,最初我认为这是一个非阻塞方法,但似乎进程间条件实现了一个用于同步自身的互斥锁。

我得到这个死锁的情况是当进程2在等待条件时被非常地杀死时,我相信这会阻止互斥锁被解锁的条件,然后当我再次运行进程2时它会阻塞。在我第二次开始处理2时,是否有重置或清理进程间条件。

1 个答案:

答案 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::mutexboost::mutex。 我想这是操作系统特有的限制。

  

为了获得更大的灵活性,请尝试使用named_upgradable_mutex

当进程崩溃并删除 可升级的互斥锁时,使用定时锁捕获异常。此类型还允许通过任一线程获取提升的权限!