1

整数キーを使用して、 std::map などの std::shared_ptr to C++ クラス インスタンスをマップに格納したいと考えています。ただし、このマップには 2 つのプロパティが必要です。

  1. キーが存在しない場合は、新しいオブジェクトを作成するのではなく、エラーを返します。
  2. キーが存在する場合は、std::shared_ptr のコピーをアトミックに取得します。つまり、あるスレッドでマップからオブジェクトを削除すると同時に、別のスレッドでマップからオブジェクトを取得することはできません。

オーバーヘッドを回避するために、可能であればマップからオブジェクトを取得および削除するための単一のミューテックス (複数の読み取り、単一の書き込みであっても) を避けたいと思います。

そのようなマップクラスはライブラリに存在しますか? そうでない場合は、実装方法を提案できますか?

4

2 に答える 2

2

1) std::map::at を使用します。キーが存在しない場合、例外が発生します

2) アクティブなオブジェクトを使用してマップにアクセスします。アクティブなオブジェクトは操作のシリアル化を処理し、競合状態を回避しますが、プレーンな古い を使用できますstd::map

于 2013-02-25T11:10:56.917 に答える
2

コレクション内の要素にミューテックスがある場合は、単純にロックフリーのデータ構造を使用できます。ブースト 1.53.0では C++ で実装されています。

ただし、ミューテックスをもう一度検討することをお勧めします。多くの場合、ミューテックスはロックフリーのデータ構造により優れたパフォーマンスを提供し (常にではありません)、管理がはるかに簡単です。ミューテックスのループがない限り、問題ありません。

access-without-creation の時点で、 C++03 を使用する場合はstd::map::findを使用し (反復子を返します)、C++11 を使用する場合はstd::map::atを使用します (参照を返します)。

EDIT : 実際にはstd::map::atは、通常のケースで要素が存在すると仮定しない限り、おそらく悪化する可能性があります(つまり、通常の操作ではなく例外的な状態に対してのみ例外を使用するというルールに反します)。ただし、例外に適用される哲学にも依存する可能性があります。

于 2013-02-25T11:14:58.180 に答える