2009-10-14 96 views
1

我有一個生產者和消費者。生產者在給定的共享內存區域中寫入固定大小的項目,並且消費者檢索它們。同步生產者和消費者與循環緩衝

隨機生產者可能會比消費者明顯更慢或更快。

我們想要的是

  1. 如果生產運行非消費者,當它填補了循環緩衝器,它保持高於消費者在消費一個寫上歷史最悠久的幀(其它快當然 - 我強調這一點,生產者和消費者必須在解決方案中同步,因爲它們是不相關的進程)。

  2. 如果消費者比生產者更快,它必須等待一個新的框架並在它出現時消耗它。

我發現生產者/不尊重的第一個請求(即,如果循環緩衝區已滿,他們在等待消費者來完成實現消費者循環緩衝器,但唯一的,而我想要覆蓋最舊的幀)。

我不想推出我自己的(容易出錯)解決方案,但使用預先封裝,測試過的解決方案。有人能指點我一個很好的C實現嗎? (C++也可以)。

非常感謝。

+0

聽起來就像你只是想刪除某人必須編碼到你看到的實現中的限制。如果你只是刪除任何阻止生產者的代碼覆蓋緩衝區中的數據,我會認爲它會像你想要的那樣工作。 – 2009-10-14 17:09:04

+0

@Carl - 以及讓頭部覆蓋尾部,您還需要提前尾部指針,否則您所做的只是清空整個緩衝區。 – ChrisW 2009-10-14 17:20:14

+0

@Carl - 不,只是允許生產者覆蓋舊的緩衝區,刪除信號量將意味着覆蓋消費者消費的項目。我需要的是一個同步的生產者消費者實現。 – janesconference 2009-10-14 18:22:36

回答

0

基本上,當消費者速度較慢時,意味着沒有人使用緩衝區,因此在刪除新框架和覆蓋舊框架之間沒有區別。所以也許下面的代碼可以幫助。生產者RTLock無法鎖定緩衝區,因爲有消費者使用緩衝區,因此在應用程序級別,您可以指示丟棄這些幀。

class SampleSynchronizer { 

    mutex mux; 

    condition_variable con_cond; 
    unsigned int con_num; 

    condition_variable pro_cond; 
    bool prod; 

public: 

    SampleSynchronizer(): con_num(0), prod(false) { 
    } 

    void consumerLock() { 
    unique_lock<mutex> locker(mux); 
    while(prod) 
     pro_cond.wait(locker); 

    con_num++; 
    } 

    void consumerUnlock() { 
    lock_guard<mutex> locker(mux); 
    con_num--; 
    con_cond.notify_one(); 
    } 

    void producerLock() { 
    unique_lock<mutex> locker(mux); 
    while(con_num > 0) 
     con_cond.wait(locker); 

    prod = true; 
    } 

    bool producerRTLock() { 
    lock_guard<mutex> locker(mux); 
    if(con_num > 0) 
     return false; 

    prod = true; 
    return true; 
    } 

    void producerUnlock() { 
    lock_guard<mutex> locker(mux); 
    prod = false; 
    pro_cond.notify_all(); 
    } 

};