访问类数据时互斥锁/解锁的替代方案

alternative to mutex lock/unlock when accessing class data

本文关键字:解锁 方案 数据 访问      更新时间:2023-10-16

我正在努力使my_class线程像这样安全。

class my_class
{
  const std::vector<double>& 
  get_data() const
  { //lock so that cannot get_data() while setting data
    lock l(m_mutex);
    return m_data;
  }
  void
  run()
  {
    vector<double> tmp;
    //some calculations on tmp.
    {  //lock so that cannot get_data() while setting m_data
      lock l(m_mutex);  
      m_data = tmp;  //set the data
    }
  }
private:
  std::vector<double> m_data;
  mutex m_mutex;
  my_class(); //non-copyable
}

CCD_ 2和CCD_ 3可以由不同的CCD_。(由于我使用openmp,m_mutexlock是围绕omp_init_lock();等命令的RAII包装器)。

然而,get_data ()上的锁的创建和销毁成本很高(当我评测代码时,这是最昂贵的操作——我经常调用get_data())。

是否可以重组my_class以移除get_data()中的锁或者这个锁是代码并行化不可避免的代价吗?

第一步是研究读写锁:这样多个读卡器就不会互相阻塞。

下一步将使用无锁定或无等待操作。网上有很多资源比我能更好地描述它们。只有一点需要注意:无锁方法处理原子(互锁)操作,这意味着数据大小需要很小。如果你走这条路,你将原子性地替换指向你的向量的指针,而不是整个向量。这意味着您的类将变得更加复杂,并将处理一些指针和内存管理。

在get_data/run函数周围使用关键部分可能更便宜,您不会产生额外的安装/拆卸开销(因为关键部分是静态初始化的),但这也会同步类的其他实例。