オブジェクトへの書き込み専用参照をコーディングする方法はありますか? たとえば、次のミューテックス クラスがあるとします。
template <class T> class mutex {
protected:
T _data;
public:
mutex();
void lock(); //locks the mutex
void unlock(); //unlocks the mutex
T& data(); //returns a reference to the data, or throws an exception if lock is unowned
};
これができないことを保証する方法はありますか:
mutex<type> foo;
type& ref;
foo.lock();
foo.data().do_stuff();
ref = foo.data();
foo.unlock();
//I have a unguarded reference to foo now
一方で、それだけの価値はありますか?プログラマーが故意にシステムを破壊することはないと考える人がいることは知っていますが、そもそもなぜプライベート変数があるのでしょうか? 「未定義の動作」とだけ言っておけばよかったのですが、それは少し安全ではないように思えます。
編集: OK、セッター ルーチンのアイデアは理解できますが、これはどのように実現できますか?
mutex<vector<int> > foo;
foo.lock();
for (int i=0; i < 10; i++) {
foo.data().push_back(i);
}
foo.unlock(); set ルーチンを使用すると、書き込みごとにコピーが必要になります。
mutex<vector<int> > foo;
foo.lock();
for (int i=0; i < 10; i++) {
vector<int> copy = foo.read();
copy.push_back(i);
foo.write(copy);
}
この特定のケースでは自明に最適化できますが、たとえば、いくつかの異なるスレッドがすべて要素をプッシュしており、いくつかのスレッドを消去している場合、これはかなりの過剰なメモリ コピー (つまり、クリティカル セクションごとに 1 つ) になる可能性があります。