C++ 进程间::命名的\u可升级\u互斥-如果进程被终止,将保持锁定状态

C++ 进程间::命名的\u可升级\u互斥-如果进程被终止,将保持锁定状态,c++,boost,locking,interprocess,robustness,C++,Boost,Locking,Interprocess,Robustness,我正在使用boost::interprocess::named\u upgradable\u mutex来同步一些进程 我正在使用boost::interprocess::sharable_lock和boost::interprocess::scoped_lock来锁定互斥锁 在测试同步时,只要进程正常工作并正常关闭,它看起来就正常 但是,我注意到,如果一个进程在持有互斥锁时被终止(例如通过TaskManager),互斥锁将保持锁定状态 知道我如何处理流程故障吗 我考虑过使用timed\u lo

我正在使用
boost::interprocess::named\u upgradable\u mutex
来同步一些进程

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

在测试同步时,只要进程正常工作并正常关闭,它看起来就正常

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

知道我如何处理流程故障吗


我考虑过使用
timed\u lock()
以防万一。。。还有其他想法吗?

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

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


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

如果你出于某种原因关闭了你的应用程序,你可以通过从Windows注销或执行命令mutex.unlock()来解锁此锁

在什么情况下可以终止进程,从而终止整个程序实例?可能重复的@curiousguy-例如TaskManager可以不干净地终止进程。@ZanLynx-这不是一回事。当然,我会在使用结束时删除互斥。但这个过程崩溃了。如果我有多个进程,我不能从另一个进程中随机删除它,我怎么知道它是锁定的还是死锁的?@YochaiTimmer如果一个进程以这种方式被杀死,这意味着什么?程序应该忽略此事件并继续吗?在本例中,我使用进程间互斥来保护共享资源。状态并不重要,当应用程序崩溃时,资源将关闭。但是锁仍然锁定在崩溃的进程上,并且没有释放。但是,如果策略是删除互斥锁并创建新互斥锁,那么任何能够将数据置于一致状态的进程如何区分“拥有锁的进程仍然繁忙”和“拥有锁的进程已死亡”,它有点违背了将互斥放在首位的目的。@KevinHopps:一种方法是通过对您的平台的适当调用(POSIX平台上的
kill(0)
)来实际检查进程是否仍然存在。正如我所说的,如果你认为你需要这个,那么你可能首先使用了错误的工具来完成这项工作。+1,你在一个使用共享内存进行消息传递的软件中看到过。作为一种明智的解决办法,我选择在每次回收环境时只使用
/bin/rm-f/dev/shm/
。从意外行为中恢复是一种很好的做法,而不是“对工作来说也是错误的”。在Linux上,如果您试图锁定一个其所有者在持有时死亡的互斥锁,则会返回
eownerded
。这样,您至少可以抛出一条可用的错误消息,并尝试恢复状态。