interprocess::named_upgradable_mutex - 如果进程被杀死则保持锁定

Posted

技术标签:

【中文标题】interprocess::named_upgradable_mutex - 如果进程被杀死则保持锁定【英文标题】:interprocess::named_upgradable_mutex - remains locked if process is killed 【发布时间】:2011-12-14 09:09:33 【问题描述】:

我正在使用boost::interprocess::named_upgradable_mutex 来同步一些进程。

我正在使用boost::interprocess::sharable_lockboost::interprocess::scoped_lock 来锁定互斥锁。

在测试同步的时候,只要进程在工作,正常关闭就可以了。

但是,我注意到,如果一个进程在持有互斥锁的同时被杀死(例如通过 TaskManager),互斥锁将保持锁定状态。

知道如何处理进程故障吗?

我考虑过使用timed_lock() 以防万一……还有其他想法吗?

【问题讨论】:

在什么情况下可以杀死进程,从而杀死整个程序实例? boost interprocess named mutex remains acquired after a crash的可能重复 @curiousguy - 例如,TaskManager 可以不干净地杀死进程。 @ZanLynx - 这不是一回事。当然,我在使用结束时删除了互斥锁。但是进程崩溃了。如果我有多个进程,我不能只是从另一个进程中随机删除它,我怎么知道它是锁定还是死锁? @YochaiTimmer 如果以这种方式杀死一个进程意味着什么?程序应该忽略这个意外并继续吗? 【参考方案1】:

您正在处理的是症状而不是问题。互斥锁的目的是允许进程或线程将共享数据置于不一致的状态。如果进程在持有互斥锁时死亡,则共享数据仍处于不一致状态。问题是如何将共享数据返回到一致状态,而不是如何解锁互斥锁。

当您将共享数据返回到一致状态时,在您返回到一致状态的数据中包含互斥锁或锁定。最简单的方法是删除现有锁并创建一个新锁。您可能必须对共享数据执行相同的操作。

如果你真的需要这样做,我建议你可能没有使用正确的工具来完成这项工作。

【讨论】:

在这种情况下,我使用进程间互斥锁来保护共享资源。状态并不重要,当应用程序崩溃时资源将关闭。但是锁仍然锁定在崩溃且未释放的进程上。 但是,任何能够将数据置于一致状态的进程如何区分“拥有锁的进程仍然很忙”和“拥有锁的进程已经死亡”?如果策略是删除互斥锁并创建一个新的互斥锁,那么它首先就违背了拥有互斥锁的目的。 @KevinHopps:一种方法是通过适当的平台调用实际检查进程是否仍然存在(POSIX 平台上的kill(0))。不过,正如我所说,如果您认为自己需要这个,那么您可能一开始就使用了错误的工具来完成这项工作。 +1,已经在一个使用共享内存进行消息传递的软件中看到了它。作为一个明智的解决方法,我选择在每次环境被回收时只使用/bin/rm -f /dev/shm/<segment_name> 从意外行为中恢复是一种很好的做法,而不是“对工作来说也是错误的”。在 Linux 上,如果您尝试锁定其所有者在持有它时死亡的互斥锁,则返回 EOWNERDEAD 的强大锁定范例。这样你至少可以抛出一个可用的错误消息,并可能尝试恢复状态。【参考方案2】:

如果你因为某种原因杀死了你的应用程序,你可以通过从 Windows 注销或执行命令 mutex.unlock() 来解锁这个锁;

【讨论】:

以上是关于interprocess::named_upgradable_mutex - 如果进程被杀死则保持锁定的主要内容,如果未能解决你的问题,请参考以下文章