c++ - queue<T> 上的原子操作?

标签 c++ multithreading c++11 visual-c++

我应该在 Visual C++ 中实现一个带有队列的类;在这个队列中我必须做原子操作。在网上搜索,我找到了 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 的原子读取或写入,但队列操作(推送或弹出)将不是原子的。

你需要保护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;
};

关于c++ - queue<T> 上的原子操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32227321/

相关文章:

c++ - Has-a关系的继承

c++ - Boost::调用连接时线程访问冲突

c++ - 如何在 GCC 4.5 中使用 C++0x 原始字符串?

c++ - 在使用 auto 时初始化结构会导致 VS 2013 中的拷贝

c++ - static_cast 和 Implicit_cast 有什么区别?

ruby - 类型 2 虚拟主机是否受到与主机操作系统相同的限制?

java - 执行者服务 - 线程超时

c# - 为什么这个多线程多连接的TCP服务器只接受一个连接?

c++ - 具有自定义散列/相等函数的 unordered_map - 函数不会被调用

C++ 将 std::vector<Derived>* 转换为 std::vector<Base> ...?