Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
队列上的原子操作<;T>;? 我应该在VisualC++中用队列实现类;在这个队列中,我必须执行原子操作。在网上搜索时,我找到了std::atomic类,但我保留了一些问题。第一个问题是:以下各项之间的区别是什么:_C++_Multithreading_C++11_Visual C++ - Fatal编程技术网

队列上的原子操作<;T>;? 我应该在VisualC++中用队列实现类;在这个队列中,我必须执行原子操作。在网上搜索时,我找到了std::atomic类,但我保留了一些问题。第一个问题是:以下各项之间的区别是什么:

队列上的原子操作<;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

A)
原子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可能意味着“队列上的操作是不可分割的”-队列上的事物可以在给定的原子操作之前或之后发生,但不能重叠,或者发生在中间。谢谢回答。因此,在您看来,“插入和删除操作应该是原子的”这句话与“使用互斥体保护操作”是相同的?如果您使用互斥体保护操作,那么操作将是原子的。在我的答案中添加了一个示例类。