首页 > 解决方案 > 从互斥锁函数中按值返回成员

问题描述

假设(对于一个玩具示例)我有这个类:

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的生命周期内,所以也许它是安全的?OTOH,我们正在复制一个成员,所以data寿命更长lockdata也许锁在复制到调用者之前超出范围?

那么:第二个版本是线程安全的吗?

标签: c++thread-safetymutex

解决方案


推荐阅读