C++ C++;使用2个线程排队

C++ C++;使用2个线程排队,c++,multithreading,C++,Multithreading,我在我的程序中使用了一个带有生产者-消费者模型的队列。我有一个线程将数据放入队列,一个线程将数据从队列中取出。我的问题是,在执行入队或出队操作时,此场景是否需要互斥锁?需要吗?如果在生产者或消费者端有多个线程,我认为有必要使用互斥,但我不确定是否有必要使用互斥 我的代码如下: template <class T> class myqueue { private: queue<T> localqueue; boost::mutex insert; pub

我在我的程序中使用了一个带有生产者-消费者模型的队列。我有一个线程将数据放入队列,一个线程将数据从队列中取出。我的问题是,在执行入队或出队操作时,此场景是否需要互斥锁?需要吗?如果在生产者或消费者端有多个线程,我认为有必要使用互斥,但我不确定是否有必要使用互斥

我的代码如下:

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();
    }
模板
类myqueue{
私人:
队列本地队列;
互斥插入;
公众:
myqueue(){}
~myqueue(){}
无效排队(T in_值){
boost::mutex::scoped_lock insert_lock=boost::mutex::scoped_lock(
本文件->插入);
localqueue.push(在_值中);
插入_lock.unlock();
}

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

asproducessingleconsumer可以完成。试试看,这是明确针对这种情况的


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

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


请注意,无锁实现的另一个要求是必须事先指定队列的最大可能大小(即,队列在使用过程中无法调整队列的大小,因为不使用锁无法安全地进行调整)注意,不仅排队和退队需要锁定,还有更复杂的问题,如无效迭代器和size()问题。我不确定STL队列是否是实现线程通信的最佳起点。
boost::lockfree::spsc_queue
    a wait-free single-producer/single-consumer queue (commonly known as ringbuffer)