gpt4 book ai didi

c++ - 访问类数据时替代互斥锁定/解锁

转载 作者:行者123 更新时间:2023-11-28 01:05:41 27 4
gpt4 key购买 nike

我正在尝试像这样使 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
}

run()get_data() 可能会被不同的 openmp 线程调用,所以我引入了一个锁。(由于我使用的是 openmp,m_mutexlockomp_init_lock(); 等命令的 RAII 包装器)。

但是,get_data() 上的锁的创建和销毁成本很高(我分析代码时最昂贵的操作 - 我经常调用 get_data()) .

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

最佳答案

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

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

关于c++ - 访问类数据时替代互斥锁定/解锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6297345/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com