我创建了一个简单的“SharedQueue”类,它由 2 个线程访问 - 一个用于插入数据,另一个用于接收数据。在此示例中,它包含 int
s 但它将被扩展为一个模板类,因此它可以容纳所有内容。
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() 会做什么;不能保证这些函数的原子性。
实现可以自由选择任何恒定时间解决方案来确定 size() 和 empty(),但这并不意味着必须在某处“可能”具有半原子行为的计数器.
关于C++ - 简单 SharedQueue 是否需要互斥量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35646255/