2016-02-28 78 views
3

我正在程序中使用生產者 - 消費者模型的隊列。我有一個線程保持隊列中的數據,並且一個線程保持隊列中的數據出隊。我的問題是在進行入隊或出隊操作時,是否需要對此場景進行互斥鎖?需要嗎?如果我在生產者或消費者端有多個線程,我就會看到互斥體的需求,但我不確定是否需要我的情況。2個線程的C++隊列

我的代碼如下:

template <class T> 
class myqueue { 
private: 

    queue<T> localqueue; 
    boost::mutex insert; 

public: 
    myqueue(){} 
    ~myqueue(){} 
    void enqueue(T in_value) { 
     boost::mutex::scoped_lock insert_lock = boost::mutex::scoped_lock(
       this->insert); 
     localqueue.push(in_value); 
     insert_lock.unlock(); 
    } 

回答

4

是的,你需要保護入隊,並與一個互斥出隊,如果你想避免競爭條件可能導致UB。

+1

注意不僅排隊和出隊需要鎖定 - 有超出更復雜的問題,如無效的迭代器和*尺寸()*的問題。我不確定STL隊列是實現線程通信的最佳起點。 – tofro

1

小號英格爾p roduce 小號英格爾Ç onsumer可以做到lockfree。嘗試boost::lockfree::spsc_queue,這是明確的這種情況。

boost::lockfree::spsc_queue 
    a wait-free single-producer/single-consumer queue (commonly known as ringbuffer) 
+1

請注意,無鎖實現所強加的另一個要求是必須提前指定隊列的最大可能大小(即隊列在使用時不能調整大小,因爲沒有安全的方法所以不用鎖) –