从互斥锁函数按值返回成员

时间:2018-12-17 14:23:48

标签: c++ thread-safety mutex

假设(对于一个玩具示例)我有以下课程:

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的生命周期内,所以也许安全吗?太太,我们正在复制成员,因此datalock寿命更长。在将data复制到调用方之前,锁是否可能超出范围?

所以:第二个版本是线程安全的吗?

0 个答案:

没有答案