STL容器多线程

最近在修改一段多线程代码,减少加锁的范围来降低进程阻塞比例,提高算法效率.

嵌套容器未全部加锁

这段代码要处理数据类的特点是容器嵌套容器(实际上是容器的模板类的成员变量包含容器).我在加线程锁时只给最外层的容器添加了互斥锁,忽略了成员变量的容器,导致随机出现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;
    }
};

参考:C++ STL容器如何解决线程安全的问题? - 知乎

错误查找过程记录

在刚开始怀疑是不是内存在函数段结束后被释放导致读错误,上网确认了下std::make_shared函数构造的变量是在堆中存放的.

具体解释如下:

在 C++ 中没有垃圾回收机制,必须自己释放分配的内存,否则就会造成内存泄露。解决这个问题最有效的方法是使用智能指针(smart pointer)。智能指针是存储指向动态分配(堆)对象指针的类,用于生存期的控制,能够确保在离开指针所在作用域时,自动地销毁动态分配的对象,防止内存泄露。智能指针的核心实现技术是引用计数,每使用它一次,内部引用计数加1,每析构一次内部的引用计数减1,减为0时,删除所指向的堆内存。

智能指针类型以及线程锁类型需后续继续了解

std::shared_ptr:共享的智能指针
std::unique_ptr:独占的智能指针
std::weak_ptr:弱引用的智能指针,它不共享指针,不能操作资源,是用来监视 shared_ptr 的。

参考:【精选】C++11:共享智能指针_make_shared_锅巴大王的博客-优快云博客

如何理解互斥锁、条件锁、读写锁以及自旋锁? - 知乎 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值