Как добавить конструктор копирования и оператор присваивания в этот класс? - PullRequest
1 голос
/ 01 ноября 2010

У меня проблемы с добавлением конструктора копирования в этот класс: http://www.justsoftwaresolutions.co.uk/threading/implementing-a-thread-safe-queue-using-condition-variables.html

Мне нужно добавить его, чтобы я мог добавить concurrent_queue в векторный контейнер stl. Попробовал ниже, и он почти компилируется. Фактически, если я удаляю the_mutex и the_condition_variable из конструктора копирования, он компилируется. Когда я добавляю это обратно, это не так. Оператор присваивания, кажется, в порядке в отношении компиляции.

concurrent_queue(concurrent_queue<Data> const& rhs):
    the_queue(rhs.the_queue),
    the_mutex(rhs.the_mutex),
    the_condition_variable(rhs.the_condition_variable)
{
}

concurrent_queue<Data>& operator = (concurrent_queue<Data> const& rhs)
{
    if (this == &rhs) return *this; // check for self assignment

    the_queue = rhs.the_queue;
    the_mutex(rhs.the_mutex);
    the_condition_variable(rhs.the_condition_variable);
}

Я получаю следующую ошибку:

concurrentqueue.h: In copy constructor ‘concurrent_queue<Data>::concurrent_queue(const concurrent_queue<Data>&) [with Data = Packet*]’:
/usr/include/c++/4.4/bits/stl_construct.h:74:   instantiated from ‘void std::_Construct(_T1*, const _T2&) [with _T1 = concurrent_queue<Packet*>, _T2 = concurrent_queue<Packet*>]’
/usr/include/c++/4.4/bits/stl_uninitialized.h:187:   instantiated from ‘static void std::__uninitialized_fill_n<<anonymous> >::uninitialized_fill_n(_ForwardIterator, _Size, const _Tp&) [with _ForwardIterator = concurrent_queue<Packet*>*, _Size = long unsigned int, _Tp = concurrent_queue<Packet*>, bool <anonymous> = false]’
/usr/include/c++/4.4/bits/stl_uninitialized.h:223:   instantiated from ‘void std::uninitialized_fill_n(_ForwardIterator, _Size, const _Tp&) [with _ForwardIterator = concurrent_queue<Packet*>*, _Size = long unsigned int, _Tp = concurrent_queue<Packet*>]’
/usr/include/c++/4.4/bits/stl_uninitialized.h:318:   instantiated from ‘void std::__uninitialized_fill_n_a(_ForwardIterator, _Size, const _Tp&, std::allocator<_Tp2>&) [with _ForwardIterator = concurrent_queue<Packet*>*, _Size = long unsigned int, _Tp = concurrent_queue<Packet*>, _Tp2 = concurrent_queue<Packet*>]’
/usr/include/c++/4.4/bits/stl_vector.h:1035:   instantiated from ‘void std::vector<_Tp, _Alloc>::_M_fill_initialize(size_t, const _Tp&) [with _Tp = concurrent_queue<Packet*>, _Alloc = std::allocator<concurrent_queue<Packet*> >]’
/usr/include/c++/4.4/bits/stl_vector.h:230:   instantiated from ‘std::vector<_Tp, _Alloc>::vector(size_t, const _Tp&, const _Alloc&) [with _Tp = concurrent_queue<Packet*>, _Alloc = std::allocator<concurrent_queue<Packet*> >]’
test.cpp:18:   instantiated from here
concurrentqueue.h:24: error: no match for call to ‘(boost::mutex) (boost::mutex&)’

EDIT: Кажется, что буст-мьютекс наследует не копируемые и условные переменные, я думаю, то же самое. Интересно то, что в задании я могу скопировать его. Зачем это вообще компилировать? Нужно ли мне беспокоиться о том, что на практике его нельзя скопировать для ситуации, для которой я его использую?

Ответы [ 2 ]

2 голосов
/ 01 ноября 2010

Оба boost::mutex и boost::condition_variable имеют только конструкторы по умолчанию.Кроме того, вы не хотите, чтобы их (потенциально заблокированное) состояние копировалось - просто используйте конструкторы по умолчанию.

Также вам не следует копировать the_queue напрямую, поскольку это не поточно-ориентировано.

1 голос
/ 01 ноября 2010

AFAIK, boost::mutex и boost::condition не подлежат копированию (и копирование блокировки мьютекса в любом случае не имеет смысла). Создайте их с помощью конструктора по умолчанию в конструкторе копирования следующим образом:

concurrent_queue(concurrent_queue<Data> const& rhs):
    the_queue(rhs.the_queue),
    the_mutex(),
    the_condition_variable()
{
}

Обратите внимание, что проблемы с безопасностью потока конструктора копирования. Если вы не копируете объекты между потоками, это не должно быть проблемой. Следуя идее из вашего предыдущего вопроса , где все concurrent_queue объекты предварительно выделены, это не должно быть проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...