队列<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;
};
我应该在 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;
};