rud*_*asi 5 c++ boost mutex ipc shared-memory
我有一个托管共享内存段,它有一个 boost::interprocess::interprocess_mutex 和一个 boost::interprocess::interprocess_condition 变量。我有 2 个进程访问共享内存,它们根据互斥体和条件同步访问。我遇到过一种情况,我的第一个进程在notify_all方法上阻塞,最初我认为这是一个非阻塞方法,但进程间条件似乎实现了一个用于同步自身的互斥体。
我遇到这个死锁的情况是当进程 2 在等待条件时被不优雅地终止时,我相信这会阻止条件互斥体被解锁,然后当我再次运行进程 2 时它会阻塞。无论如何,当我第二次启动进程 2 时,是否可以重置或清理进程间条件。
http://www.boost.org/doc/libs/1_48_0/boost/interprocess/sync/interprocess_mutex.hpp
您使用定时锁吗?
对于一个简单的死锁避免算法,请查看这里:维基百科
它是针对线程的,但我相信它可以与 interprocess_locks 一起使用。
递归地,只允许一个线程通过一把锁。如果其他线程进入锁,它们必须等待,直到最初通过的线程完成n次。但是,如果进入锁定的线程数等于被锁定的线程数,则将一个线程指定为超级线程,并且只允许其运行(跟踪其进入/退出锁定的次数)直到其完成。超级线程结束后,条件变回使用递归锁中的逻辑,并且退出的超级线程
将自己设置为不是超级线程
通知锁定器其他锁定的等待线程需要重新检查此条件
如果存在死锁情况,请设置一个新的超级线程并遵循该逻辑。否则,恢复常规锁定。
请注意,上述算法不能解决活锁情况,为了防止这种行为,semaphore请尽可能使用 a 。
我惊讶地发现 interprocess_mutex 不支持实现死锁避免算法,因为现在大多数互斥锁std::mutex已经boost::mutex支持了。我猜这是操作系统特定的限制。
为了获得更大的灵活性,请尝试使用named_upgradable_mutex
使用定时锁捕获进程崩溃时的异常并删除可升级的互斥锁!这种类型还允许任一线程获得提升的权限!
| 归档时间: |
|
| 查看次数: |
1954 次 |
| 最近记录: |