2016-06-23 13 views
-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; 
}; 

私はそれがポインタを入れ替えるのは残酷であることを理解していますが、この移行は良い方法です。

答えて

0

それは2つの実行スレッドから呼び出すことができる限り異なるスレッドがその中に別のオブジェクトを渡すと同時に

std::swapは、スレッドセーフであるstd::swapスレッドセーフです。それ以外の場合は、競合状態が発生します。

+1

つまり、 'std :: swap'はスレッドセーフではなく、[re-entrant](https://en.wikipedia.org/wiki/Reentrancy_(computing))ですか? – Zereges

+0

@Zeregesこの関数は状態を保持しないため、スレッドセーフで再入可能です。 –

関連する問題