对于boost interprocess_mutex,“进程持久性”是什么意思?

问题描述 投票:0回答:1

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上运行此操作的一些结果:

  • 如果运行进程直到正常完成然后进程,则两个进程都必须创建内存,并成功获取锁。这是预期的。
  • 如果运行processA并“强制退出”它,它永远不会到达清理代码释放锁并删除内存。现在,运行processB的内存已经存在(isMemoryCreated为true),这是预期的,因为共享内存至少具有内核持久性。但是processB无法锁定互斥锁,这似乎与boost文档相矛盾:互斥锁应该具有进程持久性,因此当processA退出时,它不应该继续存在。

这是库中的错误吗?或者“处理持久性”是否意味着与此不同的东西?

c++ boost ipc boost-interprocess
1个回答
0
投票

例如,POSIX互斥体(用于Linux实现boost :: interprocess)不拥有其内存,因此它的持久性是它所驻留的内存的持久性。

该代码在文件系统的命名文件中创建匿名互斥锁。互斥锁的持久性变为它所驻留的命名文件的持久性。

当文件取消链接时,互斥锁的持久性将变为进程持久性。

© www.soinside.com 2019 - 2024. All rights reserved.