ela*_*h r 3 c++ multithreading point-cloud-library
我想要一个在云点上包含可视化器的类.这是我的代码:
class my_vis
{
void vis_func ()
{
pcl::visualization::PCLVisualizer *vis ;
vis = new pcl::visualization::PCLVisualizer("octree viewer");
// this "vis" is just used in this function and no other place
}
void execute(){
//Start visualizer in a thread
boost::thread* visThread = new boost::thread(boost::bind(&my_vis::vis_func, this));
// bla bla
}
}
int main ()
{
my_vis vis1();
vis1.execute();
my_vis vis2();
vis2.execute();
std::getchar();
return 0 ;
}
Run Code Online (Sandbox Code Playgroud)
现在我有一类可视化器,可以在"main"中实例化.当我从类"my_vis"中只创建一个实例时,程序运行时每件事都可以.但我需要两个或更多实例.当我初始化多个实例时,发生了错误:BLOCK_TYPE_IS_VALID我认为这是因为使用了线程.但是在我的项目中需要线程化.
你能帮帮我吗?非常感谢您的耐心和帮助:)
PS我正在使用PCL 1.7
两天后,我终于解决了这个问题.
我注意pcl :: visualization :: PCLVisualizer的构造函数以及"SpinOnce"函数,我认识到如果你放一个静态锁,这样只有多个对象中的一个线程可以访问这些函数,那么问题就解决了.
以前,我在这些函数上放置了非静态锁,正如您所知,本地锁只在它们创建的同一对象中工作(不是从类中实例化的整个对象).所以我在my_vis类中定义了一个静态锁:
private static boost::mutex vis_mutex;
boost::mutex my_vis::vis_mutex; //storage for static lock
Run Code Online (Sandbox Code Playgroud)
并将"vis-> spinOnce(1)"替换为
{
boost::mutex::scoped_lock vis_lock(vis_mutex);
vis->spinOnce ();
}
Run Code Online (Sandbox Code Playgroud)
我仍然认为它不是一个永久的解决方案,这个错误最好由pcl开发人员解决:)