最近在修改一段多线程代码,减少加锁的范围来降低进程阻塞比例,提高算法效率.
嵌套容器未全部加锁
这段代码要处理数据类的特点是容器嵌套容器(实际上是容器的模板类的成员变量包含容器).我在加线程锁时只给最外层的容器添加了互斥锁,忽略了成员变量的容器,导致随机出现program received signal sigsegv
读写崩溃
因为在一个线程的代码里会对成员变量容器进行push_back操作,导致另一个线程在迭代读的过程中迭代器失效,崩溃.
修改如下,在成员变量读写过程中加锁:
class RGB_Voxel
{
public:
std::vector< RGB_pt_ptr> m_pts_in_grid;
double m_last_visited_time = 0;
RGB_Voxel() = default;
~RGB_Voxel() = default;
std::mutex m_mutex_pts_in_grid;
void add_pt( RGB_pt_ptr &rgb_pts )
{
std::lock_guard< std::mutex > lock( m_mutex_pts_in_grid );
m_pts_in_grid.push_back( rgb_pts );
}
void get_pts_in_grid( std::vector< RGB_pt_ptr > &pts_vec )
{
std::lock_guard< std::mutex > lock( m_mutex_pts_in_grid );
pts_vec = m_pts_in_grid;
}
};
错误查找过程记录
在刚开始怀疑是不是内存在函数段结束后被释放导致读错误,上网确认了下std::make_shared函数构造的变量是在堆中存放的.
具体解释如下:
在 C++ 中没有垃圾回收机制,必须自己释放分配的内存,否则就会造成内存泄露。解决这个问题最有效的方法是使用智能指针(smart pointer)。智能指针是存储指向动态分配(堆)对象指针的类,用于生存期的控制,能够确保在离开指针所在作用域时,自动地销毁动态分配的对象,防止内存泄露。智能指针的核心实现技术是引用计数,每使用它一次,内部引用计数加1,每析构一次内部的引用计数减1,减为0时,删除所指向的堆内存。
智能指针类型以及线程锁类型需后续继续了解
std::shared_ptr:共享的智能指针
std::unique_ptr:独占的智能指针
std::weak_ptr:弱引用的智能指针,它不共享指针,不能操作资源,是用来监视 shared_ptr 的。

被折叠的 条评论
为什么被折叠?



