我在我的程序中使用了生产者 - 消费者模型的队列。我有一个线程,它一直将数据排入队列,一个线程不断从队列中出列数据。我的问题是,在进行入队或出队操作时,我是否需要使用互斥锁?需要吗?如果我在生产者或消费者方面有多个线程,我认为需要互斥,但我不确定是否有必要我的情况。
我的代码如下:
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();
}
答案 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)
并行读取/写入队列可能会导致竞争条件。
所以,是的,每个修改/读取队列的操作都需要一个互斥锁。