-1

这是我的教授希望我们挑战的 compsci 讲座测验。他说这门课是关于循环缓冲区的,但有很大的问题。我试图思考一整天,但没有任何线索。请给我一些想法

#include <stdint.h>
#include <boost/thread.hpp>

template <typename T, uint32_t max>
class CircularBuffer
{
public:

    CircularBuffer() : m_WriteOffset(0), m_ReadOffset(0){}
    ~CircularBuffer(){};

    void push( T val )
    {
        boost::lock_guard<boost::mutex> guard( m_Mutex );
        m_Buffer[m_WriteOffset++] = val;
    }

    T pull()
    {
        boost::lock_guard<boost::mutex> guard( m_Mutex );
        return m_Buffer[m_ReadOffset++];
    }

private:

    boost::mutex m_Mutex;

    enum { MAX_SIZE = max };
    T m_Buffer[MAX_SIZE];
    uint32_t m_WriteOffset;
    uint32_t m_ReadOffset;
};
4

2 回答 2

1

full,empty方法未实现。偏移增量必须像m_ReadOffset = (m_ReadOffset + 1) % MAX_SIZE,那么只有缓冲区是循环的。我的意思是读写偏移。

于 2013-08-21T05:54:23.640 回答
0

你要求一个提示,所以这里是一个:

如果在读取任何元素之前推送 MAX_SIZE+1 个元素会发生什么?

于 2013-08-21T06:03:26.130 回答