提升 interprocess_mutex 复制/移动构造函数?

Posted

技术标签:

【中文标题】提升 interprocess_mutex 复制/移动构造函数?【英文标题】:Boost interprocess_mutex copy/move constructor? 【发布时间】:2016-02-08 16:41:54 【问题描述】:

我正在尝试在共享内存中创建一个对象向量,每个对象都拥有一个 interprocess_mutex,如下所示:

struct test

    test()
    interprocess_mutex mutex;
;

using namespace boost::interprocess;
managed_shared_memory seg(open_or_create, "MySharedMemory", 65536);
allocator<void, managed_shared_memory::segment_manager> void_alloc_(seg.get_segment_manager());
vector<test, allocator<test, managed_shared_memory::segment_manager>> vec(void_alloc_);
vec.push_back(test());

但是 interprocess_mutex 明确缺少复制/移动构造函数,并且 clang 无法编译并出现此错误:

copy constructor of 'test' is implicitly deleted because field 'mutex' has an inaccessible copy constructor
interprocess_mutex mutex;

这是有原因的吗?看起来 boost::thread 互斥体有一个复制构造函数。如何使用 interprocess_mutex 完成此操作?

【问题讨论】:

参见:***.com/a/29988626/576911 类型不同但问题相同。 【参考方案1】:

没有标准或 Boost mutex-type 类提供复制构造函数。如果需要复制包含互斥体成员的类,则需要将互斥体转为指针,并且需要提供拷贝构造函数来对互斥体进行适当的处​​理。

复制互斥体甚至会做什么?两个实例会引用同一个互斥锁吗?每个实例都有自己的互斥锁吗?如果在复制过程中互斥锁已经被锁定怎么办?

除了这些问题之外,互斥锁成员通常用于保护对象的其他成员。如果您支持在具有互斥体成员的类上复制,您很可能希望在复制期间的某个时间点锁定该互斥体。

【讨论】:

我在尝试移动 boost 进程间互斥锁时遇到了这个问题。你会知道为什么这是不可能的吗?【参考方案2】:

我通过将向量更改为包含 shared_ptr 而不是直接测试来解决了这个问题。 test() 仅被调用一次,并且该对象由 shared_ptr 对象拥有,该对象是可移动/可复制的:

    using namespace boost::interprocess;

    typedef managed_shared_memory::segment_manager SegmentManager;
    typedef allocator<void, SegmentManager> test_allocator;
    typedef deleter<test, SegmentManager> test_deleter;
    typedef shared_ptr<test, test_allocator, test_deleter> test_pointer;
    typedef vector<test_pointer, allocator<test_pointer, SegmentManager>> test_pointer_vector;

    managed_shared_memory seg(open_or_create, "MySharedMemory", 65536);

    test_allocator alloc(seg.get_segment_manager());
    test_deleter del(seg.get_segment_manager());

    test_pointer& p = *seg.construct<test_pointer>(anonymous_instance)(seg.construct<test>(anonymous_instance)(), alloc, del);
    test_pointer_vector& vec = *seg.construct<test_pointer_vector>(anonymous_instance)(alloc);

    vec.push_back(p);
    p.get()->mutex_.try_lock();

【讨论】:

以上是关于提升 interprocess_mutex 复制/移动构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

提升 scoped_lock 导致 CPU 消耗过多

提升变体复制语义

MySQL 8.0复制性能的提升(翻译)

关于范围界定和提升的新手问题? [复制]

pgsql物理复制(pgsql 备库的搭建以及角色互换,提升)

提升::变体; std::unique_ptr 和复制