我正在扩大基于PCL的应用程序,为此使用默认的pcl grabber代码,用于velodyne,可以在此处看到。
当我在调试模式下构建应用程序时,它会根据期望工作起作用,但是在发布构建中,云正在跳过,我松开了一两个云。我缩小了一个事实,即互不及我没有经验的问题。
// Retrieved Point Cloud Callback Function
boost::mutex mutex;
boost::function<void(const pcl::PointCloud<PointType>::ConstPtr&)> function =[&cloud, &mutex](const pcl::PointCloud<PointType>::ConstPtr& ptr)
{
boost::mutex::scoped_lock lock(mutex);
// Point Cloud Processing
cloud = ptr;
};
这是接收我的云的回电,下面是Main
中的一部分while (!viewer->wasStopped())
{
viewer->spinOnce(); // Update Viewer
tStart = clock();
boost::mutex::scoped_try_lock lock(mutex);
我无法弄清楚为什么发行版与调试有差异。有什么建议么?我使用Visual Studio 2017和PCL 1.8.1。
请查看您的第二个代码片段," Main中的部分":
boost::mutex::scoped_try_lock lock(mutex);
在这里使我感到困惑。try_lock
将尝试锁定Mutex。如果当前正在使用MUTEX,它将无法锁定MUTEX并继续执行。静音后的块可能会受到或可能不会被静音保护。
那真的是您想做的吗?您检查了锁的状态吗?
或您打算使用
boost::mutex::scoped_lock lock(mutex);
将阻止螺纹执行,直到它可以访问静音。此语句之后的块将始终由静音。
使用try_lock
,发生的事情是,如果它不能锁定互斥符,则执行将在没有锁定的情况下继续。您负责处理此案。如果您不这样做,则静音将完全无效,您将有比赛条件,不安全的并发访问和其他问题。
这也可能是您的程序在发布方面的行为与调试中的行为不同的原因。在发布程序的某些部分中,该程序运行速度要快得多,因此时间行为完全不同。可能是在调试中的时机,因此,静音旨在保护的数据结构永远不会同时访问。但是在发行中,这将完全不同。
总结一下:除非您故意使用scoped_try_lock
(实际上是内部辅助类AFAIK(,您可能打算使用scoped_lock
。