この質問に関連しているが、回答されていない質問があります。
ブーストshared_mutex(複数の読み取り/ 1つの書き込み)の例?
操作がメンバー関数内でスコープされている場合、排他ロックがどのように機能するかを理解しています。私の質問は、参照による戻り関数はどうですか?次のことを考慮してください(疑似コード):
class A {
shared_mutex _mutex;
std::string _name;
public:
const std::string& name() const {shared_lock(_mutex); return _name;}
}
次に、コードで次のようなことをするとします。
A obj;
if (obj.name().length() >0) { ... };
私の腸は、length()関数が呼び出されるまでにミューテックスがすでにスコープ外になっているため、これはスレッドセーフではない可能性があると言っていますが、わかりません。
オブジェクトをスレッドセーフにしようとしている場合、全体像で質問していると思いますが、参照によって戻ることを完全に避ける必要がありますか?それは誰かがこのようなことをすることを可能にしませんか?
A obj;
std::string& s = obj.name();
(at this point lock is out of scope)
s = "foo"; // does this change the original object's member since it is a reference?