具有2个线程的C ++队列

时间:2016-02-28 21:53:16

标签: c++ multithreading

我在我的程序中使用了生产者 - 消费者模型的队列。我有一个线程,它一直将数据排入队列,一个线程不断从队列中出列数据。我的问题是,在进行入队或出队操作时,我是否需要使用互斥锁?需要吗?如果我在生产者或消费者方面有多个线程,我认为需要互斥,但我不确定是否有必要我的情况。

我的代码如下:

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();
    }

3 个答案:

答案 0 :(得分:4)

是的,如果你想避免可能导致UB的竞争条件,你需要使用互斥锁来保护入队和出队。

答案 1 :(得分:1)

s ingle p roduce s ingle c onsumer可以完成lockfree。请尝试boost::lockfree::spsc_queue,这是针对此方案明确的。

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

答案 2 :(得分:1)

并行读取/写入队列可能会导致竞争条件

所以,是的,每个修改/读取队列的操作都需要一个互斥锁。

The following article is about consumer-producer queue