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

Joe*_*att 2 c++ multithreading visual-c++ c++11

我应该在Visual C++中用一个队列实现一个类; 在这个队列中我要做原子操作.在网上搜索,我发现了类std :: atomic,但我还有一些问题.首先是:有什么区别:

一个) atomic <queue <T>> fifo;

B)queue <atomic <T>> fifo;

第二个问题是:如何像push一样进行原子操作?

push (T.load) 
Run Code Online (Sandbox Code Playgroud)

是正确的解决方案吗?

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

任何建议表示赞赏,问候

Elo*_*eth 8

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

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

您需要通过以下方式保护queue操作mutex:

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;
};
Run Code Online (Sandbox Code Playgroud)

  • 如果您使用互斥锁保护操作,则操作将是原子的。在我的答案中添加了一个示例类。 (2认同)