2016-02-08 3 views
0

Я пытаюсь создать вектор объектов в общей памяти, что каждый принадлежит к interprocess_mutex следующим образом:Boost 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 constructor of 'test' is implicitly deleted because field 'mutex' has an inaccessible copy constructor 
interprocess_mutex mutex; 

Есть ли причина для этого? Похоже, что boost :: thread mutex имеет конструктор копирования. Как это сделать, используя interprocess_mutex?

+0

См: http://stackoverflow.com/a/29988626/576911 Типа отличается, но проблема такая же. –

ответ

0

Я решил проблему, изменив вектор, чтобы он содержал shared_ptr вместо теста напрямую. тест() вызывается только один раз, и объект находится в собственности объект 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(); 
0

Нет стандарта или Boost mutex -type класс предоставляет конструктор копирования. Если вам нужно скопировать классы, содержащие член мьютекса, мьютекс нужно превратить в указатель, и вам необходимо предоставить конструктор копирования для надлежащего обращения к мьютексу.

Что бы скопировать мьютекс? Оба экземпляра ссылаются на один и тот же мьютекс? Будет ли у каждого экземпляра собственный мьютекс? Что делать, если мьютекс уже заблокирован во время копирования?

Помимо этих вопросов, элемент мьютекса часто используется для защиты других объектов объекта. Если вы поддерживаете копирование в классе с членом mutex, вы, скорее всего, захотите заблокировать этот мьютекс в какой-то момент во время копирования.

Смежные вопросы