Hi everyone,
I specialized the boost::circular_buffer template class for concurrent access. But I have no idea about how the locking strategy must be for copy ctor, and also assignment operator. I inserted question marks at the end of the related lines.
Thanks in advance...
template <class T>
class CircularBuffer
{
typedef boost::circular_buffer<T> internal_buffer;
typedef boost::shared_mutex ReadWriteMutex;
typedef boost::shared_lock<boost::shared_mutex> ReadLock;
typedef boost::unique_lock<boost::shared_mutex> WriteLock;
public:
// Constructors
explicit CircularBuffer(capacity_type capacity = 10)
: m_capacity(capacity)
, m_buffer(capacity)
{
}
// copy ctor
CircularBuffer(const CircularBuffer& other)
{
//WriteLock w_lock(rw_mutex); ???????????
m_capacity = other.m_capacity;
m_buffer = other.m_buffer;
}
size_type size() const
{
ReadLock r_lock(rw_mutex);
return m_buffer.size();
}
void push_back(param_value_type item = value_type())
{
WriteLock w_lock(rw_mutex);
m_buffer.push_back(item);
}
// assignment operator
CircularBuffer& operator= (const CircularBuffer& other)
{
//WriteLock w_lock(rw_mutex); ??????????
if (this != &other)
{
m_capacity = other.m_capacity;
m_buffer = other.m_buffer;
}
return *this;
}
private:// member variables
capacity_type m_capacity;
internal_buffer m_buffer;
// rw_mutex for internal buffer
mutable ReadWriteMutex rw_mutex;
};