C++ - 简单 SharedQueue 是否需要互斥锁?
C++ - Simple SharedQueue is mutex necessary?
我创建了一个简单的 "SharedQueue" class,它由 2 个线程访问 - 一个用于插入数据,另一个用于接收数据。在此示例中,它包含 int
s,但它将扩展为模板 class,因此它可以包含所有内容。
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(),但这并不意味着 必须 是某个地方的计数器 "probably" 具有半原子行为。
我创建了一个简单的 "SharedQueue" class,它由 2 个线程访问 - 一个用于插入数据,另一个用于接收数据。在此示例中,它包含 int
s,但它将扩展为模板 class,因此它可以包含所有内容。
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(),但这并不意味着 必须 是某个地方的计数器 "probably" 具有半原子行为。