队列上的原子操作<;T>;? 我应该在VisualC++中用队列实现类;在这个队列中,我必须执行原子操作。在网上搜索时,我找到了std::atomic类,但我保留了一些问题。第一个问题是:以下各项之间的区别是什么:
A)队列上的原子操作<;T>;? 我应该在VisualC++中用队列实现类;在这个队列中,我必须执行原子操作。在网上搜索时,我找到了std::atomic类,但我保留了一些问题。第一个问题是:以下各项之间的区别是什么:,c++,multithreading,c++11,visual-c++,C++,Multithreading,C++11,Visual C++,A) 原子fifo B) 队列fifo ? 第二个问题是:我怎样才能像推一样进行原子操作 push (T.load) 这是正确的解决方案吗 最后一个问题是:如果我用互斥来保护队列上的某个操作,我仍然需要对它执行原子操作吗 感谢您的建议,问候您A)原子fifo甚至不会编译,因为std::atomic需要一个简单的可复制类型 B) 将执行T类型的原子读取或写入,但使用队列(推送或弹出)的操作将不是原子的 您需要使用互斥锁保护队列操作: template<typename T> cla
原子fifo代码>
B) 队列fifo代码>
?
第二个问题是:我怎样才能像推一样进行原子操作
push (T.load)
这是正确的解决方案吗
最后一个问题是:如果我用互斥来保护队列上的某个操作,我仍然需要对它执行原子操作吗
感谢您的建议,问候您A)原子fifo
甚至不会编译,因为std::atomic
需要一个简单的可复制类型
B) 将执行T类型的原子读取或写入,但使用队列(推送或弹出)的操作将不是原子的
您需要使用互斥锁保护队列
操作:
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;
};
模板
给我的队列分类
{
公众:
无效推送(常数T和值)
{
std::锁和保护锁(mumutex);
m_queque.push(值);
}
void pop()
{
std::锁和保护锁(mumutex);
m_queque.pop();
}
私人:
std::队列m_queque;
可变std::mutex m_mutex;
};
您到底需要哪种雾化?什么是原子?编写正确的原子队列非常困难。世界级的专家在这方面是失败的。你知道你是否有一个生产者-一个消费者吗?单一生产者-多消费者?多生产者-单一消费者?多生产者-多消费者?这些是不同的情况,有不同的要求。当你说原子时,我想到了无锁。如果您只是在pop
和push
函数的开头获取互斥体,您应该会很好。在windows上,您可以使用PPL头和并发容器来实现线程安全的标准库。在您的上下文中,atomic可能意味着“队列上的操作是不可分割的”-队列上的事物可以在给定的原子操作之前或之后发生,但不能重叠,或者发生在中间。谢谢回答。因此,在您看来,“插入和删除操作应该是原子的”这句话与“使用互斥体保护操作”是相同的?如果您使用互斥体保护操作,那么操作将是原子的。在我的答案中添加了一个示例类。