我创建了一个简单的“SharedQueue”类,它由2个线程访问 - 一个插入数据,另一个接收数据。在这个例子中,它拥有int
s,但它将被扩展成为模板类,因此它可以容纳所有内容。C++ - 简单SharedQueue是互斥体必需的?
internalQueue
只是一个std::queue<int>
和qMtx
是一个std::mutex
。
下面实现的一部分:
size_t SharedQueue::size() const
{
return internalQueue.size();
}
bool SharedQueue::empty() const
{
return internalQueue.empty();
}
int SharedQueue::front()
{
int retVal;
qMtx.lock();
retVal = internalQueue.front();
qMtx.unlock();
return retVal;
}
void SharedQueue::push(const int& val)
{
qMtx.lock();
internalQueue.push(val);
qMtx.unlock();
}
void SharedQueue::push(int&& val)
{
qMtx.lock();
internalQueue.push(val);
qMtx.unlock();
}
void SharedQueue::pop()
{
qMtx.lock();
internalQueue.pop();
qMtx.unlock();
}
我的问题是:
我需要调用诸如size()
或empty()
方法时锁定互斥?
我试图找到任何队列多线程的例子,但它没有回答我的问题。
您必须问自己在并发场景中size()和empty()是什么意思。 – juanchopanza
如果情况是这样的:如果为空 - >等待5秒,否则立即处理里面的内容然后它需要锁定。这是你的意思@juanchopanza? – lewiatan
我的意思是说,它可以是空的,当你问,并立即变得不空,所以调用'empty()'的结果是不是很有用。和size()一样。您必须锁定呼叫以及使用呼叫结果的所有代码。 – juanchopanza