Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/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
Multithreading 使用原子进行比较和交换\u比较\u交换\u弱_Multithreading_C++11 - Fatal编程技术网

Multithreading 使用原子进行比较和交换\u比较\u交换\u弱

Multithreading 使用原子进行比较和交换\u比较\u交换\u弱,multithreading,c++11,Multithreading,C++11,在这段代码中,std::swap是线程安全的,因此可以同时从两个执行线程调用它,或者我需要使用原子\u compare\u exchange\u弱()而不是swap() 我如何知道这是否适用于所有CPU?我很高兴它能在英特尔CPU上运行 #include <utility> class resource { int x = 0; }; class foo { public: foo() : p{new resource{}} { }

在这段代码中,std::swap是线程安全的,因此可以同时从两个执行线程调用它,或者我需要使用原子\u compare\u exchange\u弱()而不是swap()

我如何知道这是否适用于所有CPU?我很高兴它能在英特尔CPU上运行

#include <utility>
class resource {
    int x = 0;
};
class foo
{
    public:
        foo() : p{new resource{}}
        { }
        foo(const foo& other) : p{new resource{*(other.p)}}
        { }
        foo(foo&& other) : p{other.p}
        {
            other.p = nullptr;
        }
        foo& operator=(foo other)
        {
            swap(*this, other);
            return *this;
        }
        virtual ~foo()
        {
            delete p;
        }
        friend void swap(foo& first, foo& second)
        {
            using std::swap;
            swap(first.p, second.p);
        }
    private:
        resource* p;
};
#包括
类资源{
int x=0;
};
福班
{
公众:
foo():p{new resource{}
{ }
foo(constfoo&other):p{newresource{*(other.p)}
{ }
foo(foo&&other):p{other.p}
{
其他。p=nullptr;
}
foo&运算符=(foo其他)
{
掉期(*本,其他);
归还*这个;
}
虚拟~foo()
{
删除p;
}
朋友无效交换(foo&first,foo&second)
{
使用std::swap;
互换(第一个.p,第二个.p);
}
私人:
资源*p;
};
我理解交换一个指针是过分的,但这可能是一个很好的练习

是线程安全的,因此可以同时从两个执行线程调用它


std::swap
是线程安全的,只要不同的线程向其中传递不同的对象。否则会出现争用条件。

这意味着
std::swap
不是线程安全的,对吗?@Zereges此函数不维护任何状态,因此它是线程安全且可重入的。