1

我有一个资源需要保护在一个进程内以及跨多个进程的访问。我通过创建一个命名互斥体来管理这个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 创建一块共享内存,但这似乎也没有共享引用计数。

我在 SO 上发现了一个类似的问题,但接受的答案似乎不足以满足我的需求,因为它只是指“增强文档”,但没有明确指示何时remove()可以安全发布。

当我确定最后一个访问它的进程已经关闭或可能崩溃时,如何安全地清理这个命名的互斥锁?

谢谢你。

4

1 回答 1

0

据我所知,不支持任何引用计数。

如果您正在使用例如 shell 脚本启动或停止进程,您可以从脚本中删除启动/停止时的共享内存文件。

如果您有一个始终首先启动的进程,那么您可以使用它在程序启动时删除共享内存文件(或类似地在程序停止时的最后停止进程中)。

另一种方法是使用共享内存自己实现引用计数- 最后一个进程将删除所有共享内存文件。但是,如果其中一个进程崩溃,这将不起作用,您仍然可以尝试在 segfault 信号处理程序中删除,但这可能并不总是有效。

更新:正如@sehe 提到boost::interprocess::shared_ptr的可用于引用计数。

于 2015-07-29T21:26:33.533 回答