队列<T>上的原子操作?

Atomic operation on queue<T>?

我应该在 Visual C++ 中使用队列实现 class;在这个队列中我必须做原子操作。在网上搜索,我找到了 class std::atomic ,但我有一些疑问。第一个是:有什么区别:

A) atomic <queue <T>> fifo;

B) queue <atomic <T>> fifo;

第二个问题:如何实现像push一样的原子操作?

push (T.load) 

是正确的解决方案吗?

最后一个问题是:如果我用互斥量保护队列上的某些操作,我仍然需要对其进行原子操作吗?

欢迎任何建议,问候

A) atomic<queue <T>> fifo; 甚至不会编译,因为 std::atomic 需要一个简单的可复制类型

B) 将执行类型 T 的原子读取或写入,但对队列(推送或弹出)的操作将不是原子的。

您需要使用 mutex 来保护 queue 操作:

template<typename T>
class my_queue
{
public:
    void push( const T& value )
    {
        std::lock_guard<std::mutex> lock(m_mutex);
        m_queque.push(value);
    }

    void pop()
    {
        std::lock_guard<std::mutex> lock(m_mutex);
        m_queque.pop();
    }

private:
    std::queue<T> m_queque;
    mutable std::mutex m_mutex;
};