concurrent_vector

concurrent_vector#

concurrent_vector<T> は、動的に拡張可能な T の配列です。他のスレッドが concurrent_vector の要素を操作しているときや、それ自体を拡張しているときでも、concurrent_vector を安全に拡張できます。安全な並行拡張のため、concurrent_vector には、動的配列の一般的な使用をサポートする 3 つのメソッドがあります: push_backgrow_by、および grow_to_at_least

メソッド push_back(x) は x を配列に安全に追加します。メソッド grow_by(n) は、T() で初期化された n 個の連続する要素を安全に追加します。どちらのメソッドも、最初に追加された要素を指すイテレーターを返します。各要素は T() で初期化されます。例えば、次のルーチンは、C 文字列を共有ベクトルに安全に追加します。

void Append( concurrent_vector<char>& vector, const char* string ) { 
    size_t n = strlen(string)+1; 
    std::copy( string, string+n, vector.grow_by(n) ); 
}

関連メソッド grow_to_at_least(n) は、ベクトルが短い場合サイズ n まで拡張します。growth メソッドの同時呼び出しは、必ずしも要素がベクターに追加された順序で返されるわけではありません。

size() メソッドはベクトル内の要素数を返します。これには、push_backgrow_by,、または grow_to_at_least メソッドによって並行して構築中の要素が含まれる場合があります。前の例では、concurrent_vector 内の要素が連続したアドレスにない可能性があるため、strcpypointers ではなく、std::copy とイテレーターを使用しています。また、イテレーターが end() 値を超えない限り、concurrent_vector が拡張する間も、安全にイテレーターを使用できます。ただし、イテレーターは並行に構築中の要素を参照する場合があります。そのため、構築とアクセスを同期させる必要があります。

concurrent_vector<T> は、配列がクリアされるまで要素を移動しません。これは、シングルスレッドのコードでも STL std::vector より有利です。ただし、concurrent_vector は、std::vector よりもオーバーヘッドが大きくなります。したがって、他のアクセスを処理する際に動的にサイズを変更する必要がある場合、または要素を移動してはならない場合のみ、concurrent_vector を使用してください。

警告

concurrent_vector 操作は、ベクトルのクリアや破棄ではなく、拡張に関しても並行性に対して安全です。concurrent_vector で他の操作が進行中の場合、clear() を呼び出さないでください。