0

私は、要素として多数の一意のオブジェクトを持つ std::set を持っています。

プログラムのメインスレッドで:

  1. セットからいくつかのオブジェクトを取得します
  2. 処理するデータをそれぞれに割り当てます
  3. これらのオブジェクトをセットから削除します
  4. 最後に、オブジェクトをスレッドプール内のスレッドに渡して処理します
  5. これらのスレッドは、オブジェクトの処理を完了すると、それらをセットに戻します。(次の反復で、メイン スレッドが再びデータの次のバッチをそれらのオブジェクトに割り当てて処理できるようにするため)

この配置は完璧に機能します。しかし、オブジェクトをセットに戻すときにエラーが発生した場合 (たとえば、std::set.insert()throws bad_alloc)、すべてがトスになります。そのエラーを無視して先に進むと、オブジェクトが処理セットに戻る方法がなくなり、プログラム フローから永久に除外され、メモリ リークが発生します。

この問題に対処するために、オブジェクトをセットから削除しないようにしました。代わりに、オブジェクトが「処理中」であることを示すメンバー フラグを設定します。しかし、その場合の問題は、セットのすべての要素を繰り返し処理しているときに、メインスレッドが「処理中」のオブジェクトに何度も遭遇することです。また、パフォーマンスが大幅に低下します (セット内のオブジェクトの数が非常に多い)。

ここでより良い代替手段は何ですか?

  1. std::listの代わりに使用できますstd::setか? bad_allocリストに要素を追加するときにポインタを割り当てるだけでよいため、要素を追加し直すときにリストに問題はありません。しかし、リスト要素を一意にするにはどうすればよいでしょうか? それを達成した場合、std::set として効率的でしょうか?

  2. 要素を削除して std::set に追加し直す代わりに、要素をセットの最初または最後に移動する方法はありますか? 未処理のオブジェクトと処理済みのオブジェクトがセットの最初と最後に向かって一緒に蓄積されるようにします。

  3. 他の解決策はありますか?

4

0 に答える 0