次のように、同時に挿入して読み取ることができるベクトル型のオブジェクトを実装できるはずです。
- ベクトルにスペースがある場合は、挿入するだけです。これは読書を妨げるべきではありません。
- 再割り当てする必要がある場合は、割り当て、コピー、データへのポインターの更新、解放を行うことができます。
- ベクトルから読み取りたい場合は、データへのポインターのフェッチとデータからの読み取りがアトミックに行われるようにする必要があります。
このように、再割り当て中にベクターから読み取ると、まだ有効な古い場所から読み取るだけです。(もちろん、削除はスレッドセーフではありませんが、それで問題ありません。何かを削除したい場合は、それを考慮に入れる必要があります。とにかく、std::vector
現在持っているものより悪くはありません。)
次に、これをあまり問題なくハッシュテーブルに適合させることができるはずです。これらのベクトルの 1 つをバケットに使用し、各バケットをこれらのベクトルの 1 つに戻すだけです。(最適な漸近的複雑さを得るために、ある種の自己均衡二分木でバケットをバックアップする必要があることは理解していますが、私のアプリケーションではベクトルが問題なく、ここで物事をあまりにも大きく逸脱したくありません。)
2 つの質問:
- これは理にかなっていますか、それとも何か不足していますか? (スレッドセーフに対する直感は信用できません。)
- もしそうなら、C++ 標準ライブラリのコンテナのいくつかをプリミティブとして使用して、これまたはそのようなものを構築することは可能ですか?それとも、すべてをゼロから作成するしかありませんか?
std::atomic
(もちろん、いくつかの場所で使用すると思いますが、std::vector
またはstd::unordered_map
ここのようなものを使用する方法はありますか?)
あるいは、このテーマについて読める本や何かがありますか?