C++程序运行过程中遇到了下列错误:
Error in `./rgbd_tum’: double free or corruption (!prev): 0x00007f3b385d0a40,且错误出现的时间点随机,如下图所示:
上网查了资料,有人说是内存访问越界了,但是仔细检查程序之后没有此情况,经过反复思考,才发现是线程间共享资源访问冲突了,下面介绍一下问题以及解决办法:
程序的结构如下:
MapObject.h:
public:
std::vector<VoxelNode *> GetAllVoxels();
void UpdateVoxelMap(KeyFrame* pKFs);
private:
std::vector<VoxelNode *> mVoxels;
MapObject.cc:
std::vector<VoxelNode *> GetAllVoxels()
{
return mVoxels;
}
void UpdateVoxelMap(KeyFrame* pKF)
{
bool findvoxel = false;
for(auto p:ground.points)
{
findvoxel = false;
pcl::PointXYZRGB point;
for (size_t voxel_id = 0; voxel_id < mVoxels.size(); voxel_id++)
{
if(mVoxels[voxel_id]->isContainPoint(point))
{
mVoxels[voxel_id]->AddPoint(point);
findvoxel = true;
break;
}
}
}
}
主程序中拥有若干个线程,在Viewer线程中调用GetAllVoxels()函数,Tracking线程调用UpdateVoxelMap()函数,而两个函数存在访问同一个变量*std::vector<VoxelNode > mVoxels,由此造成了访问冲突。
解决办法:加互斥锁
1、在MapObject.h中添加std::mutex mMutexVoxels变量,添加完成后如下所示:
public:
std::vector<VoxelNode *> GetAllVoxels();
void UpdateVoxelMap(KeyFrame* pKFs);
private:
std::vector<VoxelNode *> mVoxels;
std::mutex mMutexVoxels;
2、在两个函数访问此变量时加上互斥锁,如下所示:
std::vector<VoxelNode *> GetAllVoxels()
{
unique_lock<mutex> lock(mMutexVoxels);
return mVoxels;
}
void UpdateVoxelMap(KeyFrame* pKF)
{
unique_lock<mutex> lock(mMutexVoxels);
for(auto p:ground.points)
{
findvoxel = false;
pcl::PointXYZRGB point;
for (size_t voxel_id = 0; voxel_id < mVoxels.size(); voxel_id++)
{
if(mVoxels[voxel_id]->isContainPoint(point))
{
mVoxels[voxel_id]->AddPoint(point);
break;
}
}
}
}
此时问题就解决了。