boost::named_mutex: 最后一个进程关闭时安全清理
Posted
技术标签:
【中文标题】boost::named_mutex: 最后一个进程关闭时安全清理【英文标题】:boost::named_mutex: Safely cleaning up when last process closes 【发布时间】:2015-07-29 17:33:59 【问题描述】:我有一个资源需要保护在一个进程内以及跨多个进程的访问。我通过boost::interprocess:named_recursive_mutex
创建了一个命名互斥体来解决这个问题,效果很好。
#include <boost/interprocess/sync/named_recursive_mutex.hpp>
boost::interprocess::named_recursive_mutex mut(
boost::interprocess::open_or_create, "MY_SHARED_MUTEX_123");
但是,据我了解,这最终应该通过remove()
进行清理,即:
mut.remove("MY_SHARED_MUTEX");
但是,这个调用似乎完全破坏了互斥锁,而不是检查/减少引用计数,所以当我知道没有其他进程正在使用它时,我试图找到一种安全的方法来发出 remove()
调用.我也可以通过 boost 创建一块共享内存,但这似乎也没有共享引用计数。
I've found a similar question on SO,但the accepted answer 似乎不足以满足我的需求,因为它只是指"boost docs",但没有明确指示何时可以安全地发布remove()
。
当我确定最后一个访问它的进程已关闭或可能崩溃时,如何安全地清理这个命名的互斥锁?
谢谢。
【问题讨论】:
【参考方案1】:据我所知,不支持任何引用计数。
如果您使用例如 shell 脚本启动或停止进程,您可以从脚本中删除启动/停止时的共享内存文件。
如果您有一个总是首先启动的进程,那么您可以使用它在程序启动时删除共享内存文件(或类似地在程序停止时的最后停止进程中)。
另一种方法是使用共享内存自己实现引用计数 - 最后一个进程将删除所有共享内存文件。但是,如果其中一个进程崩溃,这将不起作用,您仍然可以尝试在 segfault 信号处理程序中删除,但这可能并不总是有效。
更新:正如@sehe 提到的,boost::interprocess::shared_ptr
可用于引用计数。
【讨论】:
简而言之,boost 似乎不支持“Robust Mutexes”,因此完成上述操作的唯一方法是编写系统服务、守护进程或资源管理器来创建和处理对互斥锁,或使用 shell 脚本来管理 PID 计数。由于此代码位于共享库中,因此我能做的最好的事情就是对使用它的用户应用程序设置一个小限制,并尽可能减少命名互斥体的使用。 我认为这是真的。 TBF 我不知道任何可靠的命名互斥体的可移植实现。复杂性是命名性(共享性应该是Linux上的一个问题,但是首先包含互斥锁的共享内存区域会遇到类似的问题)。最后但同样重要的是:引用计数存在:boost::interprocess::shared_ptr
就是因为这个原因。确保不要在实例化上竞争。以上是关于boost::named_mutex: 最后一个进程关闭时安全清理的主要内容,如果未能解决你的问题,请参考以下文章