2013-08-21 65 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

鎖控制器鎖定互斥鎖,並在超出範圍時將其解鎖。 –