読み取り専用の方法で一連の構造体をほぼ常に反復処理する必要がありますが、1M 以上の読み取りごとに、スレッドの 1 つがアイテムを追加する場合があります。ここでミューテックスを使用するのはやり過ぎだと思います。また、読み取り/書き込みロックには読者にとって独自の欠点があることもどこかで読みました。
私は std::vector で reserve() を使用することを考えていましたが、この回答ロックの使用を避けるためにインデックスセーフな方法を使用して STL コンテナーを反復処理しますか? それを無効にしているように見えました。
どの方法が最速であるかについてのアイデアはありますか? 最も重要なことは、読者が競合をできるだけ少なくして、迅速かつ効率的に反復できるようにすることです。書き込み操作は時間に依存しません。
更新: 私の使用例のもう 1 つは、「リスト」に構造体ではなくポインターを含めることができるということです。つまり、std::vector です。同じ要件が適用されます。
更新 2: 仮説の例
グローバルにアクセス可能:
typedef std::vector<MyClass*> Vector;
Vector v;
v.reserve(50);
リーダー スレッド 1 ~ 10: (これらはほぼ常に実行されます)
.
.
int total = 0;
for (Vector::const_iterator it = v.begin(); it != v.end(); ++it)
{
MyClass* ptr = *it;
total += ptr->getTotal();
}
// do something with total
.
.
ライター スレッド 11 ~ 15:
MyClass* ptr = new MyClass();
v.push_back(ptr);
それが基本的にここで起こることです。スレッド 1 ~ 15 はすべて同時に実行できますが、通常は 1 ~ 2 個の読み取りスレッドと 1 ~ 2 個の書き込みスレッドしかありません。