boost::named_mutex: 最后一个进程关闭时安全清理
boost::named_mutex: Safely cleaning up when last process closes
我有一个资源,我需要在一个进程内和跨多个进程保护对它的访问。我通过 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");
但是,这个调用似乎完全破坏了互斥量,而不是 check/decrement 引用计数,所以我试图找到一种安全的方法来发出 remove()
调用,当我知道没有其他进程正在使用它。我也可以通过 boost 创建一块共享内存,但它似乎也没有共享引用计数。
I've found a similar question on SO, but the accepted answer doesn't seem adequate for my needs, as it just refers to the "boost docs",但没有明确指示何时可以安全发布 remove()
。
当我确定访问它的最后一个进程已关闭或可能崩溃时,我如何安全地清理这个命名的互斥量?
谢谢。
据我所知,不支持任何引用计数。
如果您使用 shell 脚本启动或停止进程,您可以从脚本中删除 start/stop 处的共享内存文件。
如果您有一个始终先启动的进程,那么您可以使用它在程序启动时删除共享内存文件(或类似地在程序停止时的最后一个停止进程中)。
另一种方法是使用共享内存自己实现引用计数 - 最后一个进程将删除所有共享内存文件。但是,如果其中一个进程崩溃,这将不起作用,您仍然可以尝试删除段错误信号处理程序,但这可能并不总是有效。
更新:如@sehe所述,boost::interprocess::shared_ptr
可用于引用计数。
我有一个资源,我需要在一个进程内和跨多个进程保护对它的访问。我通过 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");
但是,这个调用似乎完全破坏了互斥量,而不是 check/decrement 引用计数,所以我试图找到一种安全的方法来发出 remove()
调用,当我知道没有其他进程正在使用它。我也可以通过 boost 创建一块共享内存,但它似乎也没有共享引用计数。
I've found a similar question on SO, but the accepted answer doesn't seem adequate for my needs, as it just refers to the "boost docs",但没有明确指示何时可以安全发布 remove()
。
当我确定访问它的最后一个进程已关闭或可能崩溃时,我如何安全地清理这个命名的互斥量?
谢谢。
据我所知,不支持任何引用计数。
如果您使用 shell 脚本启动或停止进程,您可以从脚本中删除 start/stop 处的共享内存文件。
如果您有一个始终先启动的进程,那么您可以使用它在程序启动时删除共享内存文件(或类似地在程序停止时的最后一个停止进程中)。
另一种方法是使用共享内存自己实现引用计数 - 最后一个进程将删除所有共享内存文件。但是,如果其中一个进程崩溃,这将不起作用,您仍然可以尝试删除段错误信号处理程序,但这可能并不总是有效。
更新:如@sehe所述,boost::interprocess::shared_ptr
可用于引用计数。