考虑一个包含以下 vector 的类:
std::vector<std::tuple<double, double, double> > _data;
和以下成员函数:
inline double second(const unsigned int i) const
{
return std::get<1>(_data[i]);
}
我能保证这个函数是线程安全的吗(注意我返回了一个 double 的拷贝)?
如果不是,这个函数的线程安全版本是什么?
最佳答案
如果 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
的添加使得类不可复制,因为它本身是不可复制的。
关于c++ - 从 std::tuple of double 的 std::vector 读取线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16222529/