-1
このコードでは、std :: swapスレッドセーフなので、同時に2つの実行スレッドから呼び出すことができますか、またはswap()の代わりにatomic_compare_exchange_weak()を使用する必要がありますか?は、atomic_compare_exchange_weakを使用して比較してスワップします
これがすべてのCPUで動作するかどうかはどのようにわかりますか? Intel 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;
};
私はそれがポインタを入れ替えるのは残酷であることを理解していますが、この移行は良い方法です。
つまり、 'std :: swap'はスレッドセーフではなく、[re-entrant](https://en.wikipedia.org/wiki/Reentrancy_(computing))ですか? – Zereges
@Zeregesこの関数は状態を保持しないため、スレッドセーフで再入可能です。 –