2016-06-16 10 views
2

私はstd::vector<std::atomic_bool>を任意のnにリサイズしたいと思っています。 resize()は、その代入演算子ではなく、データ型のコピーコンストラクタに依存しているため、プログラムはビルドされません。 atomic_boolにデフォルト値を割り当てる方法はありますか、ループを使用していて、すべての値をstore()入力しても問題はありませんか?std :: vector <std :: atomic_bool>のサイズを変更してすべてのアトミックなブールに割り当てます

は、私が試した何を:あなたはどこか別の場所になるためにそれらを再割り当て傾けるよう

#include <atomic> 
#include <vector> 

class foo() { 
public: 
    std::vector<std::atomic_bool> vec; 

    foo() { 
     std::atomic_bool temp(true); 

     vec.resize(100, std::atomic_bool(true)); //try 1 

     vec.resize(100, temp); //try 2 
    } 
} 
+4

それはなりません

FWIWは、別のオプションは、デフォルトの建設と割り当ての組み合わせとしてコピー建設を指揮するタイプで、個々のstd::atomic_bool Sをラップしています原子型をベクトルに固執する感覚。アトミック型は複数のスレッドによってアクセスされるように設計されており、要素を再配置することはできません。再割り当てをしたくない場合は、最初からサイズ100のベクトルを作成してください([Demo](http://melpon.org/wandbox/permlink/UHlG7obdmMgslfxx))。 –

+0

@KerrekSBいいと思います。スレッドがベクトルを変更しようとしていない限り、複数のスレッドからベクトルを読み取ることができます。 @BryanChen; –

+0

;もちろん、それは可能ですが、それは理にかなっていません。それのためのusecaseはありません。 –

答えて

7

Tがコピー可能でも移動可能でもない場合には、std::vector<T>のサイズを変更することはできません。期間。この場合、std::dequeと考えてください。

std::deque<std::atomic_bool> D; 
D.emplace_back(true); // write a helper to do this 100 times if you want 

ただし、アトミックの標準ライブラリコンテナはアトミックではありません。コンテナに新しい要素を追加するのはアトミックな操作ではないため、おそらくミューテックスでコンテナを保護しなければならず、アトミックを内部に格納するメリットはありません。

-2

アトミックは、移動されるように設計されていません。ただし、それらを置き換えることができます。

vec = std::vector<std::atomic_bool>(100, true); 

(私はあなたがここにtrueを使用することができ、100%確実ではないんだけど、私はあなたができると信じています。)

0

ブライアンの提案であるdequeは健全で、O(1)ランダムアクセスが可能ですが、それはvectorよりも2倍遅くなると予想しています。 Kerrekが提案する、より高いレベルのクラスを管理することはvectorでも実行可能です。

struct Copy_Constructible_Atomic_Bool : std::atomic_bool 
{ 
    Copy_Constructible_Atomic_Bool(const std::atomic_bool& rhs) 
    { 
     std::atomic_bool::operator=(rhs); 
    } 

    Copy_Constructible_Atomic_Bool(const Copy_Constructible_Atomic_Bool& rhs) 
    { 
     std::atomic_bool::operator=(rhs); 
    } 
}; 

使用法:

std::vector<Copy_Constructible_Atomic_Bool> vec; 
std::atomic_bool temp; 
temp = true; 
vec.resize(100, temp); 
関連する問題