假设(对于一个玩具示例)我有以下课程:
class Foo {
mutable std::mutex mutex;
std::vector<int> data;
public:
void add(int x) {
std::lock_guard<std::mutex> lock(mutex);
data.push_back(x);
}
std::vector<int> getData() const;
};
现在,我确定这是getData()
的确定版本:
std::vector<int> Foo::getData() const {
std::lock_guard<std::mutex> lock(mutex);
auto result = data; // Safely copy.
return result; // Return a local by value.
} // lock goes out of scope and unlocks.
但是这呢?这样安全吗?:
std::vector<int> Foo::getData() const {
std::lock_guard<std::mutex> lock(mutex);
return data; // <- Is this threadsafe?
}
return
行发生在lock
的生命周期内,所以也许安全吗?太太,我们正在复制成员,因此data
比lock
寿命更长。在将data
复制到调用方之前,锁是否可能超出范围?
所以:第二个版本是线程安全的吗?