同時に書き込まれるオブジェクトの数が多いが、潜在的に変化する可能性があります。そのアクセスをミューテックスで保護したい。そのために、私は を使用すると思っていましたが、コピーまたは移動コンストラクターがないstd::vector<std::mutex>
ため、これは機能しません。std::mutex
std::vector::resize()
この難問に対する推奨される解決策は何ですか?
edit : すべての C++ ランダム アクセス コンテナーは、サイズ変更のためにコピーまたは移動コンストラクターを必要としますか? std::deque は役に立ちますか?
再編集
まず、あなたのすべての考えに感謝します。ミュートを回避したり、オブジェクトに移動したりするソリューションには興味がありません(詳細/理由の説明は控えます)。そのため、ミューテックスの数を調整したいという問題 (ミューテックスがロックされていないときに調整が行われることが保証されている場合) を考えると、いくつかの解決策があるようです。
1固定数のミュートを使用し、ハッシュ関数を使用してオブジェクトからミュートにマップできます(キャプテンオブリバスの回答のように)。これにより衝突が発生しますが、mutice の数がスレッドの数よりもはるかに多くても、オブジェクトの数よりも少ない場合、衝突の数は少なくなるはずです。
2ラッパークラスを定義できます(ComicSansMSの回答のように)、たとえば
struct mutex_wrapper : std::mutex
{
mutex_wrapper() = default;
mutex_wrapper(mutex_wrapper const&) noexcept : std::mutex() {}
bool operator==(mutex_wrapper const&other) noexcept { return this==&other; }
};
を使用しstd::vector<mutex_wrapper>
ます。
3std::unique_ptr<std::mutex>
個々のミューテックスを管理するために使用できます(Matthias の回答のように)。このアプローチの問題は、各ミューテックスがヒープ上で個別に割り当てられ、割り当て解除されることです。したがって、私は好む
4 std::unique_ptr<std::mutex[]> mutices( new std::mutex[n_mutex] );
特定の数n_mutex
のミュートが最初に割り当てられたとき。この数が後で不十分であることが判明した場合、私は単純に
if(need_mutex > n_mutex) {
mutices.reset( new std::mutex[need_mutex] );
n_mutex = need_mutex;
}
では、これらの (1,2,4) のどれを使用すればよいでしょうか?