我在将复制构造函数添加到此类时遇到麻烦:
http://www.justsoftwaresolutions.co.uk/threading/implementing-a-thread-safe-queue-using-condition-variables.html

我需要添加它,以便可以在STL vector 容器中添加并发队列。
在下面尝试过,几乎可以编译。实际上,如果我从副本构造函数中删除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&)’

编辑:
看来Boost Mutex继承了不可复制的条件变量,我认为是相同的。
有趣的是,在作业中我可以复制它。为什么还要编译?我是否需要担心它在实际使用中无法复制的事实?

最佳答案

boost::mutexboost::condition_variable都只有默认构造函数。除此之外,您不希望复制其(潜在锁定)状态-只需使用默认构造函数即可。

另外,您不应该直接复制the_queue,因为这不是线程安全的。

关于c++ - 如何向此类添加复制构造函数和赋值运算符?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4066411/

10-10 14:05
查看更多