首页 > 解决方案 > boost interprocess_mutex 的“进程持久性”是什么意思?

问题描述

Boost Interprocess 文档中,(匿名)进程共享互斥锁类型具有Process persistence,它定义如下:

进程持久性:该机制一直持续到所有打开该机制的进程都关闭它、退出或崩溃。

由于这些互斥锁是匿名的,因此要共享它们必须放置在一些共享内存中(具有更长的持久性,取决于平台的内核或文件系统)。

让我们考虑这个最小的例子:

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

这是图书馆的错误吗?或者“过程持久性”是否意味着与此不同的东西?

标签: c++boostipcboost-interprocess

解决方案


例如,POSIX 互斥锁(在 boost::interprocess 的 Linux 实现中使用)不拥有它的内存,因此它的持久性是它所在的内存的持久性。

该代码在文件系统的命名文件中创建了一个匿名互斥锁。互斥体的持久性成为它所在的命名文件的持久性。

当文件被取消链接时,互斥锁的持久性就变成了进程的持久性。


推荐阅读