【问题标题】:Thread safe read from a std::vector of std::tuple of double?从 std::tuple of double 的 std::vector 线程安全读取?
【发布时间】:2013-04-25 18:53:16
【问题描述】:

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

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

以及以下成员函数:

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

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

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

【问题讨论】:

  • 只要不写入 _data[i],它就是线程安全的
  • 如果你的向量可以被另一个线程修改,那么没有某种同步是不安全的。
  • @yngum 我想你的意思是_data,而不是_data[i]

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


【解决方案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 会使类不可复制,因为它本身是不可复制的。

【讨论】:

  • 注意这里元组的存在与否与这段代码的线程安全无关。 double 并不比 tuple&lt;double, double, double&gt; 更线程安全。
猜你喜欢
  • 1970-01-01
  • 2012-03-07
  • 2012-02-20
  • 1970-01-01
  • 2019-06-15
  • 1970-01-01
  • 1970-01-01
  • 2016-06-15
相关资源
最近更新 更多