C++ - 简单 SharedQueue 是否需要互斥锁?

C++ - Simple SharedQueue is mutex necessary?

我创建了一个简单的 "SharedQueue" class,它由 2 个线程访问 - 一个用于插入数据,另一个用于接收数据。在此示例中,它包含 ints,但它将扩展为模板 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" 具有半原子行为。