我应该在 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;
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)