首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >增强interprocess_mutex复制/移动构造函数?

增强interprocess_mutex复制/移动构造函数?
EN

Stack Overflow用户
提问于 2016-02-08 16:41:54
回答 2查看 459关注 0票数 0

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

代码语言:javascript
复制
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无法使用此错误进行编译:

代码语言:javascript
复制
copy constructor of 'test' is implicitly deleted because field 'mutex' has an inaccessible copy constructor
interprocess_mutex mutex;

这有什么原因吗?它看起来像boost::线程互斥体有一个复制构造函数。如何使用interprocess_mutex完成这一任务?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-08 20:32:59

我通过改变向量以包含shared_ptr来解决这个问题,而不是直接测试。test()只被调用一次,并且该对象属于shared_ptr对象,该对象是可移动/可复制的:

代码语言:javascript
复制
    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();
票数 0
EN

Stack Overflow用户

发布于 2016-02-08 18:18:40

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35274715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档