访问类数据时互斥锁/解锁的替代方案
alternative to mutex lock/unlock when accessing class data
我正在努力使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_mutex
和lock
是围绕omp_init_lock();
等命令的RAII包装器)。
然而,get_data ()
上的锁的创建和销毁成本很高(当我评测代码时,这是最昂贵的操作——我经常调用get_data()
)。
是否可以重组my_class以移除get_data()
中的锁或者这个锁是代码并行化不可避免的代价吗?
第一步是研究读写锁:这样多个读卡器就不会互相阻塞。
下一步将使用无锁定或无等待操作。网上有很多资源比我能更好地描述它们。只有一点需要注意:无锁方法处理原子(互锁)操作,这意味着数据大小需要很小。如果你走这条路,你将原子性地替换指向你的向量的指针,而不是整个向量。这意味着您的类将变得更加复杂,并将处理一些指针和内存管理。
在get_data/run函数周围使用关键部分可能更便宜,您不会产生额外的安装/拆卸开销(因为关键部分是静态初始化的),但这也会同步类的其他实例。
相关文章:
- 我应该在锁定TBitmap画布后解锁它吗
- 虚假唤醒是否会解锁所有等待线程,甚至是不相关的线程?
- c++ 为什么我不应该从不同的线程解锁互斥锁
- 在新作用域中使用unique_lock是否等效于在使用共享资源的工作结束时解锁调用
- "data race"(不是真的)在通知条件变量并解锁关联的互斥锁后
- 程序输入密码并解锁窗口7,8,10
- 在通知之前完成手动解锁
- STD :: Mutex如何在不同的线程中解锁
- 如何使用单个解锁方法(可称为读取器或写入器)实现C++读写器锁?
- 如何在C 中自动汇总日志消息并自动解锁互斥X
- 如果我们已经手动解锁了unique_lock,那么破坏时会解锁吗?
- 正在解锁手动未定义/不良设计的锁定guard
- 从C 运行代码后解锁绑定(在R中)的问题
- 在功能返回之前,可以解锁Mutex会增加并发
- 当互斥锁解锁时,它会notify_all或notify_one
- 如何确保在C ++中解锁储物柜?哪种解决方案更好
- 我应该如何在一个功能中锁定wxMutex,并在另一个功能中将其解锁
- mutex::lock() 检查一次解锁状态是否已经被另一个线程锁定?
- 在Qt 5.4中可以对互斥对象进行两次解锁吗
- 访问类数据时互斥锁/解锁的替代方案