Boost interprocess_mutex copy/move 构造函数?
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 明确缺少 copy/move 构造函数并且 clang 无法编译并出现此错误:
copy constructor of 'test' is implicitly deleted because field 'mutex' has an inaccessible copy constructor
interprocess_mutex mutex;
这有什么原因吗?看起来 boost::thread mutex 有一个复制构造函数。如何使用 interprocess_mutex?
完成此操作
没有标准或 Boost mutex
类型 class 提供复制构造函数。如果需要复制包含互斥成员的classes,需要将互斥转化为指针,需要提供拷贝构造函数来对互斥进行适当的处理。
复制互斥体有什么作用?这两个实例会引用同一个互斥体吗?每个实例都会有自己的互斥体吗?如果在复制过程中互斥锁已经被锁定怎么办?
除了这些问题之外,互斥成员通常用于保护对象的其他成员。如果您支持在具有互斥成员的 class 上进行复制,您很可能希望在复制过程中的某个时刻锁定该互斥。
我通过将向量更改为包含 shared_ptr 而不是直接测试来解决问题。 test() 只被调用一次,对象属于 shared_ptr 对象,即 move/copyable:
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,如下所示:
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 明确缺少 copy/move 构造函数并且 clang 无法编译并出现此错误:
copy constructor of 'test' is implicitly deleted because field 'mutex' has an inaccessible copy constructor
interprocess_mutex mutex;
这有什么原因吗?看起来 boost::thread mutex 有一个复制构造函数。如何使用 interprocess_mutex?
完成此操作没有标准或 Boost mutex
类型 class 提供复制构造函数。如果需要复制包含互斥成员的classes,需要将互斥转化为指针,需要提供拷贝构造函数来对互斥进行适当的处理。
复制互斥体有什么作用?这两个实例会引用同一个互斥体吗?每个实例都会有自己的互斥体吗?如果在复制过程中互斥锁已经被锁定怎么办?
除了这些问题之外,互斥成员通常用于保护对象的其他成员。如果您支持在具有互斥成员的 class 上进行复制,您很可能希望在复制过程中的某个时刻锁定该互斥。
我通过将向量更改为包含 shared_ptr 而不是直接测试来解决问题。 test() 只被调用一次,对象属于 shared_ptr 对象,即 move/copyable:
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();