从Boost Interprocess documentation,(匿名)进程共享的互斥锁类型具有进程持久性,它定义如下:
进程持久性:该机制持续到所有已打开机制的进程关闭,退出或崩溃。
由于这些互斥锁是匿名的,要共享它们必须放在一些共享内存中(持久性较长,内核或文件系统取决于平台)。
让我们考虑这个最小的例子:
namespace bi = boost::interprocess;
{
bool isMemoryCreated = /*assume function to get this info*/;
bi::shared_memory_object shm = [&]() -> bi::shared_memory_object
{
if (isMemoryCreated)
{
return {bi::open_only, "sharemem", bi::read_write};
}
else
{
bi::shared_memory_object shm{bi::create_only, "sharemem", bi::read_write};
shm.truncate(sizeof(bi::interprocess_mutex));
return shm;
}
}();
//Map the whole shared memory in this process
region = bi::mapped_region(shm, bi::read_write);
void * address = region.get_address();
bi::interprocess_mutex mutex = [&]()
{
if (isMemoryCreated)
{
return static_cast<bi::interprocess_mutex*>(address);
}
else
{
return new (address) bi::interprocess_mutex;
}
}();
std::cout << mutex->try_lock() << std::endl;
// wait on external condition
mutex->unlock();
bi::shared_memory_object::remove("sharemem");
}
以下是在macOS上运行此操作的一些结果:
isMemoryCreated
为true),这是预期的,因为共享内存至少具有内核持久性。但是processB无法锁定互斥锁,这似乎与boost文档相矛盾:互斥锁应该具有进程持久性,因此当processA退出时,它不应该继续存在。这是库中的错误吗?或者“处理持久性”是否意味着与此不同的东西?
例如,POSIX互斥体(用于Linux实现boost :: interprocess)不拥有其内存,因此它的持久性是它所驻留的内存的持久性。
该代码在文件系统的命名文件中创建匿名互斥锁。互斥锁的持久性变为它所驻留的命名文件的持久性。
当文件取消链接时,互斥锁的持久性将变为进程持久性。