我有一个相关的问题,但不是,这个问题回答共享互斥与回报:C++参考
Example for boost shared_mutex (multiple reads/one write)?
我明白了排它锁是如何工作的,当操作中的作用域成员函数。我的问题是,通过引用返回函数呢?考虑以下(伪代码):
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?
由于您提到的怀疑,它不是**线程安全的。返回副本而不是参考将是一个可行的解决方案。 – 2013-03-25 20:26:38
@Drew Dormann,是否简单地从返回值中删除引用运算符强制它返回一个副本,还是编译器仍然可以优化它作为引用? – amnesia 2013-03-25 20:36:40