我有一个资源,需要保护一个进程内以及多个进程之间的访问。我通过创建一个命名互斥体来管理这个问题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()
, ie:
mut.remove("MY_SHARED_MUTEX");
然而,这个调用似乎完全破坏了互斥体,而不是检查/减少引用计数,所以我试图找到一种安全的方法来发出remove()
当我知道没有其他进程正在使用它时调用。我也可以通过 boost 创建一块共享内存,但这似乎也没有共享引用计数。
我在 SO 上发现了类似的问题, but 接受的答案似乎不足以满足我的需要,因为它只是指“增强文档”,但没有给出明确的指示何时remove()
可以安全发行。
当我确定最后一个访问该互斥体的进程已关闭或可能崩溃时,如何安全地清理该互斥体?
谢谢。
There isn't any reference counting supported to my knowledge.
如果您使用 shell 脚本来启动或停止进程,则可以从脚本中删除启动/停止时的共享内存文件。
如果您有一个始终首先启动的进程,那么您可以使用它在程序启动时删除共享内存文件(或类似地在程序停止时最后一个停止进程中)。
Another approach would be implementing reference counting yourself using shared memory - last process would delete all shared memory files. However this won't work if one of the processes crash, you could still try removing in segfault signal handler but this may not always work too.
Update:正如@sehe提到的boost::interprocess::shared_ptr
可用于引用计数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)