icp与线程池一起使用时出现分段错误

时间:2018-09-29 09:25:49

标签: c++ segmentation-fault threadpool point-cloud-library

线程池来自https://github.com/progschj/ThreadPool。 icp多线程示例代码如下所示:

#include <iostream>
#include <vector>
#include <chrono>

#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/registration/icp.h>

#include "ThreadPool.h" 

void foo(pcl::IterativeClosestPoint<pcl::PointXYZ, pcl::PointXYZ> icp) { 
  pcl::IterativeClosestPoint<pcl::PointXYZ, pcl::PointXYZ> icp_(icp); 
  pcl::PointCloud<pcl::PointXYZ> cloud; 
  std::cout << &icp << std::endl; 
  icp_.align(cloud); 
  std::this_thread::sleep_for(std::chrono::seconds(1)); 
} 

int main() { 

  pcl::PointCloud<pcl::PointXYZ>::Ptr map(new pcl::PointCloud<pcl::PointXYZ>); 

  map->width = 10; 
  map->height = 1; 
  map->is_dense = false; 
  map->points.resize(10); 

  for (auto &point:map->points) { 
    point.x = (RAND_MAX / 2 - rand()) / (RAND_MAX + 1.0f) * 10; 
    point.y = (RAND_MAX / 2 - rand()) / (RAND_MAX + 1.0f) * 10; 
    point.z = (RAND_MAX / 2 - rand()) / (RAND_MAX + 1.0f) * 2; 
  } 
  pcl::PointCloud<pcl::PointXYZ>::Ptr 
      lidar(new pcl::PointCloud<pcl::PointXYZ>); 
  *lidar = *map; 

  pcl::IterativeClosestPoint<pcl::PointXYZ, pcl::PointXYZ> icp; 
  icp.setInputSource(lidar); 
  icp.setInputTarget(map); 

  ThreadPool pool(3); 
  std::vector<std::future<void> > results; 

  for (int i = 0; i < 10; ++i) { 
    results.emplace_back( 
        pool.enqueue(foo, icp) 
    ); 
  } 

  for (auto &&result: results) 
    result.get(); 
  std::cout << std::endl; 

  return 0; 
} 

我在foo函数中打印出icp对象的地址,结果如下:

0x7f387345b9d0 
0x7f3872c5a9d0 
0x7f38724599d0

然后我遇到了细分错误。因此,如果我声明三个线程,则第四项任务将使其卡住。

但是,如果我按如下所示更改foo函数,则一切正常

void foo(pcl::IterativeClosestPoint<pcl::PointXYZ,pcl::PointXYZ> icp){ 
  pcl::IterativeClosestPoint<pcl::PointXYZ,pcl::PointXYZ> icp_; 
  icp_.setInputSource(icp.getInputSource()); 
  icp_.setInputTarget(icp.getInputTarget()); 
  pcl::PointCloud<pcl::PointXYZ> cloud; 
  icp_.align(cloud); 
  std::this_thread::sleep_for(std::chrono::seconds(1)); 
} 

但是我希望在foo函数外部设置icp的参数,然后在foo函数中复制icp。因此,我不需要在foo线程任务中更改参数。

我对内存的基础架构不熟悉,我尝试使用valgrind,但不知道。

0 个答案:

没有答案