標準のベクトルを囲む単純なラッパーを指定すると、通常どおりコンテンツを設定できるようにスレッドセーフな方法でoperator[]
を実装する良い方法はありますか?ここでC++スレッドセーフなブラケットオペレータプロキシ
struct bracket_operator_proxy;
struct example
{
auto operator[](size_t i) const { return bracket_operator_proxy(v, m, i); }
private:
std::vector<double> v;
std::mutex m;
};
はbracket_operator_proxy
のための私の迅速かつ素朴な試みです:
struct bracket_operator_proxy
{
bracket_operator_proxy(std::vector<double>& v, std::mutex& m, int i)
: v(v), m(m), i(i) {}
operator double() const
{
std::lock_guard<std::mutex> l(m);
return v[i];
}
auto operator=(double d)
{
std::lock_guard<std::mutex> l(m);
v[i] = d;
return d;
}
//... further assignment operators ...
private:
std::vector<double>& v;
std::mutex& m;
int i;
};
はこのもう十分ですか?または私は私の足を吹き飛ばす何かを逃していますか?
現在、あなたは 'operator_'が 'bracket_operator_proxy 'ではなく' double'を返すように '(example [i] = 4.2)= 42;'を禁止しています。落とし穴ではありません。 – Jarod42
@ Jarod42:はい、その意図でした。さもなければ、デストラクタでmutexのロックを解除する必要があると思います。より良い選択肢のための任意のアイデア? – davidhigh
mutexは 'operator ='の最後にロックされていないので、 'bracket_operator_proxy 'を返すことはOKです。 BTW 'std :: vector>'は良い選択肢のようです。 –
Jarod42