线程池来自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,但不知道。