2013-08-21 40 views
-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; 
}; 
+0

给你一个提示:代码中有一个多余的分号。然后,用两个线程写一个测试,一个用一个模式写N个元素,另一个读取N个元素并验证模式。 –

+0

你应该包括''而不是''。 – dyp

+0

...并使用std :: thread,但假设你有一个C++ 11编译器。 –

回答

1

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

+0

我可以问你lock_guard如何在函数内部工作吗?我知道互斥体如何工作,但不知道如何使用增强功能。 – user842589

+0

对不起,我无法回答你的问题。我其实不知道C++,只是回答了数据结构的逻辑部分。 –

0

你问了一个提示,所以这里是一个:

,如果你阅读任何前推MAX_SIZE + 1组的元素,会发生什么?

+0

谢谢,真的不知道互斥锁和lock_guard函数是如何工作的,所以我有点失去了主要问题。 – user842589

+0

锁控制器锁定互斥锁,并在超出范围时将其解锁。 –