线程安全读取std :: vector的std :: tuple的double?

时间:2013-04-25 18:53:17

标签: c++ c++11 concurrency thread-safety stdvector

考虑一个包含以下向量的类:

std::vector<std::tuple<double, double, double> > _data;

以及以下成员函数:

inline double second(const unsigned int i) const
{
    return std::get<1>(_data[i]);
}

我是否保证此函数是线程安全的(请注意我返回了double的副本)?

如果没有,这个函数的线程安全版本是什么?

1 个答案:

答案 0 :(得分:1)

如果std::vector可以被另一个线程修改,则这不是线程安全的。为了使其成为线程安全的,必须同步对std::vector的访问。一种可能的解决方案是引入std::mutex并将其与std::vector实例相关联。在这种情况下,std::mutex将是包含std::vector的类的成员变量:

#include <mutex>

class X
{
private:
    std::vector<std::tuple<double, double, double>> data_;
    mutable std::mutex data_mutex_;
public:
    double second(const unsigned int i) const
    {
        // Note that 'operator[]' is not bounds checked.
        // Recommend adding a check to ensure 'i' is
        // within range or use 'at()'.

        std::lock_guard<std::mutex> lk(data_mutex_);
        return std::get<1>(data_[i]);
    }
};

请注意,添加std::mutex会使该类不可复制,因为它本身是不可复制的。