我有一个与此问题相关但未得到回答的问题:
boost shared_mutex(多次读取/一次写入)的示例?
我了解当操作在成员函数范围内时,排他锁是如何工作的。我的问题是,按引用返回函数呢?考虑以下(伪代码):
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?