我有一个资源,我需要保护进程内和多个进程的访问权限。我通过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",但没有明确说明何时{{1}可以安全地发布。
当我确定访问它的最后一个进程已关闭或可能已崩溃时,如何安全地清理此命名的互斥锁?
谢谢。
答案 0 :(得分:0)
据我所知,没有支持任何引用计数。
如果使用例如shell脚本启动或停止进程,则可以从脚本中删除开始/停止时的共享内存文件。
如果您有一个始终首先启动的进程,那么您可以在程序启动时使用它来删除共享内存文件(或类似于程序停止时的最后一个停止进程)。
另一种方法是使用共享内存实现引用计数 - 最后一个进程将删除所有共享内存文件。但是,如果其中一个进程崩溃,这将无法工作,您仍然可以尝试在segfault信号处理程序中删除,但这可能并不总是有效。
更新:正如@sehe提到的boost::interprocess::shared_ptr
可用于引用计数。