2

concurrent_vector は連続したメモリ ブロックを使用しないため、これが問題ないかどうかを確認したいと思います。

concurrency::concurrent_vector<Something> my_array;

//Populate 'm_array' somehow perhaps involving multiple threads

const auto iter  = std::find_if (my_array.begin (), m_array.end (), SomeLambda);
const int  index = iter - my_array.begin ();

私の質問: 'index' が (concurrect_vector::operator[] メソッドを介して) 見つけたばかりの要素にインデックスを付けない場合はありますか? 別のスレッドが理論的に要素を変更できることを認識しています-それは私の質問ではありません。

これでうまくいくはずだと思いますが、私は生のポインターを扱うことに慣れているので、(うっかり微妙なバグの原因を追加しないように) 質問したいと思います。

4

2 に答える 2

3

concurrent_vector::iteratorintはランダム アクセス イテレータであるため、差を取ることはサポートされており、有効です (ただし、結果を格納するために を使用するべきではありません)。

もちろん、お気づきのように、それはスレッドセーフではありません。

于 2013-05-01T11:20:28.343 に答える
3

安全ですが、std::distanceとにかく使用しないのはなぜですか?

  • それはより慣用的です。
  • 容器を変えるとうまくいきます。
  • それは同じくらい効率的です。
于 2013-05-01T11:24:37.353 に答える