繁体   English   中英

Boost interprocess_mutex复制/移动构造函数?

[英]Boost interprocess_mutex copy/move constructor?

我试图在共享内存中创建对象向量,每个对象都拥有一个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完成此操作?

没有标准或Boost mutex -type类提供复制构造函数。 如果需要复制包含互斥锁成员的类,则需要将互斥锁转换为指针,并且需要提供一个复制构造函数来适当地处理互斥锁。

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

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

我通过将向量更改为包含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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM